summaryrefslogtreecommitdiff
path: root/libpiny/lib/Piny/Email.pm
diff options
context:
space:
mode:
Diffstat (limited to 'libpiny/lib/Piny/Email.pm')
-rw-r--r--libpiny/lib/Piny/Email.pm49
1 files changed, 49 insertions, 0 deletions
diff --git a/libpiny/lib/Piny/Email.pm b/libpiny/lib/Piny/Email.pm
new file mode 100644
index 0000000..baa56f0
--- /dev/null
+++ b/libpiny/lib/Piny/Email.pm
@@ -0,0 +1,49 @@
+# Copyright © 2010 Julian Blake Kongslie <jblake@omgwallhack.org>
+# Licensed under the BSD 3-clause license.
+
+use strict;
+use warnings;
+
+package Piny::Email;
+
+use Moose;
+use Moose::Util::TypeConstraints;
+use MooseX::StrictConstructor;
+
+use Email::Valid::Loose;
+
+# Types
+
+my $checker = Email::Valid::Loose->new("-fqdn" => 1, "-fudge" => 0, "-local_rules" => 0, "-mxcheck" => 1, "-tldcheck" => 0 );
+
+subtype 'EmailAddress'
+ => as 'Str'
+ => where { $checker->address( $_ ) }
+ => message { 'That does not appear to be a valid email address.' }
+ ;
+
+# Attributes
+
+has 'address' =>
+ ( is => 'ro'
+ , isa => 'EmailAddress'
+ );
+
+# Builder methods
+
+# If constructed with just one argument, then treat it as an address.
+around BUILDARGS => sub {
+ my ( $orig, $class ) = ( shift, shift );
+
+ if ( @_ == 1 && ! ref $_[0] ) {
+ return $class->$orig( address => $_[0] );
+ } else {
+ return $class->$orig( @_ );
+ };
+};
+
+# Moose boilerplate
+
+__PACKAGE__->meta->make_immutable;
+
+1;