The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use MooseX::Prototype;

my $EmailAddress = object {
	'local_part'   => undef,
	'domain_part'  => undef,
	'&to_string'   => sub {
		my ($self) = @_;
		join '@', $self->local_part, $self->domain_part;
	},
};

use Test::More tests => 5;

my $GmailAddress = $EmailAddress->new(domain_part => 'gmail.com')->create_class;
ok(defined $GmailAddress);

my $HotmailAddress = $EmailAddress->new(domain_part => 'hotmail.com')->create_class('HotmailAddress');
is($HotmailAddress, 'HotmailAddress');

my $alice = $GmailAddress->new(local_part => 'alice');
is($alice->to_string, 'alice@gmail.com');

my $bob = $HotmailAddress->new(local_part => 'bob');
is($bob->to_string, 'bob@hotmail.com');

my $carol = $HotmailAddress->new(local_part => 'carol', domain_part => 'hotmail.co.uk');
is($carol->to_string, 'carol@hotmail.co.uk');