Factor out canonicalize_handles into a separate method
[gitmo/Mouse.git] / lib / Mouse / Attribute.pm
index 1e60e21..2076297 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use Carp 'confess';
+use Scalar::Util 'blessed';
 
 sub new {
     my $class = shift;
@@ -35,8 +36,6 @@ sub has_default         { exists $_[0]->{default}         }
 sub has_predicate       { exists $_[0]->{predicate}       }
 sub has_clearer         { exists $_[0]->{clearer}         }
 sub has_handles         { exists $_[0]->{handles}         }
-sub has_weak_ref        { exists $_[0]->{weak_ref}        }
-sub has_init_arg        { exists $_[0]->{init_arg}        }
 sub has_type_constraint { exists $_[0]->{type_constraint} }
 sub has_trigger         { exists $_[0]->{trigger}         }
 sub has_builder         { exists $_[0]->{builder}         }
@@ -145,13 +144,8 @@ sub create {
         if ref($args{default})
         && ref($args{default}) ne 'CODE';
 
-    $args{handles} = { map { $_ => $_ } @{ $args{handles} } }
-        if $args{handles}
-        && ref($args{handles}) eq 'ARRAY';
-
-    confess "You must pass a HASH or ARRAY to handles"
-        if exists($args{handles})
-        && ref($args{handles}) ne 'HASH';
+    $args{handles} = { $self->_canonicalize_handles($args{handles}) }
+        if $args{handles};
 
     $args{type_constraint} = delete $args{isa};
 
@@ -197,7 +191,7 @@ sub find_type_constraint {
     my $checker = Mouse::TypeRegistry->optimized_constraints->{$type};
     return $checker if $checker;
 
-    confess "Unable to parse type constraint '$type'";
+    return sub { blessed($_) && blessed($_) eq $type };
 }
 
 sub verify_type_constraint {
@@ -206,8 +200,7 @@ sub verify_type_constraint {
 
     my $type = $self->type_constraint
         or return 1;
-    my $constraint = $self->find_type_constraint
-        or return 1;
+    my $constraint = $self->find_type_constraint;
 
     return 1 if $constraint->($_);
 
@@ -216,6 +209,21 @@ sub verify_type_constraint {
     Carp::confess("Attribute ($name) does not pass the type constraint because: Validation failed for \'$type\' failed with value $_");
 }
 
+sub _canonicalize_handles {
+    my $self    = shift;
+    my $handles = shift;
+
+    if (ref($handles) eq 'HASH') {
+        return %$handles;
+    }
+    elsif (ref($handles) eq 'ARRAY') {
+        return map { $_ => $_ } @$handles;
+    }
+    else {
+        confess "Unable to canonicalize the 'handles' option with $handles";
+    }
+}
+
 1;
 
 __END__
@@ -239,18 +247,42 @@ installed. Some error checking is done.
 
 =head2 class -> OwnerClass
 
-=head2 default -> Value
+=head2 is_required -> Bool
+
+=head2 default -> Item
+
+=head2 has_default -> Bool
 
-=head2 predicate -> MethodName
+=head2 is_lazy -> Bool
 
-=head2 clearer -> MethodName
+=head2 predicate -> MethodName | Undef
+
+=head2 has_predicate -> Bool
+
+=head2 clearer -> MethodName | Undef
+
+=head2 has_clearer -> Bool
 
 =head2 handles -> { LocalName => RemoteName }
 
+=head2 has_handles -> Bool
+
 =head2 weak_ref -> Bool
 
 =head2 init_arg -> Str
 
+=head2 type_constraint -> Str
+
+=head2 has_type_constraint -> Bool
+
+=head2 trigger => CODE | Undef
+
+=head2 has_trigger -> Bool
+
+=head2 builder => MethodName | Undef
+
+=head2 has_builder -> Bool
+
 Informational methods.
 
 =head2 generate_accessor -> CODE