use warnings;
use Carp 'confess';
+use Scalar::Util 'blessed';
sub new {
my $class = shift;
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} }
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};
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 {
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->($_);
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__
=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