The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package AnyEvent::MSN::Types;
{ $AnyEvent::MSN::Types::VERSION = 0.002 }
use Moose::Util::TypeConstraints;

#
subtype 'AnyEvent::MSN::Types::Passport', as 'Str' => where {
    my $atom       = qr{[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+};
    my $dot_atom   = qr{$atom(?:\.$atom)*};
    my $quoted     = qr{"(?:\\[^\r\n]|[^\\"])*"};
    my $local      = qr{(?:$dot_atom|$quoted)};
    my $quotedpair = qr{\\[\x00-\x09\x0B-\x0c\x0e-\x7e]};
    my $domain_lit = qr{\[(?:$quotedpair|[\x21-\x5a\x5e-\x7e])*\]};
    my $domain     = qr{(?:$dot_atom|$domain_lit)};
    my $addr_spec  = qr{$local\@$domain};
    $_ =~ $addr_spec;
} => message {
    'An MSN Passport looks like an email address: you@hotmail.com';
};

#
subtype 'AnyEvent::MSN::Types::OnlineStatus' =>
    as enum([qw[NLN FLN BSY IDL BRB AWY PHN LUN]]);

#
no Moose::Util::TypeConstraints;
1;