Mind you, Attribute::Property generates lvalue subroutines, so a simple 'sub email { }' won't replace the interface in a compatible way.
Furthermore, A::P supports adding validation and processing:
sub email : Property { process; validate }
The return value of the block will indicate whether the value given validates.