sub init_arg { $_[0]->{init_arg} }
sub type_constraint { $_[0]->{type_constraint} }
+sub has_name { exists $_[0]->{name} }
+sub has_class { exists $_[0]->{class} }
+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 generate_accessor {
my $attribute = shift;
my $default = $attribute->{default};
my $trigger = $attribute->{trigger};
my $type = $attribute->{type_constraint};
-
- my $constraint = sub {
- return unless $type;
-
- my $checker = Mouse::TypeRegistry->optimized_constraints->{$type};
- return $checker if $checker;
-
- confess "Unable to parse type constraint '$type'";
- }->();
+ my $constraint = $attribute->find_type_constraint;
my $accessor = 'sub {
my $self = shift;';
return $attribute;
}
+sub find_type_constraint {
+ my $self = shift;
+ my $type = $self->type_constraint;
+
+ return unless $type;
+
+ my $checker = Mouse::TypeRegistry->optimized_constraints->{$type};
+ return $checker if $checker;
+
+ confess "Unable to parse type constraint '$type'";
+}
+
+sub verify_type_constraint {
+ my $self = shift;
+ local $_ = shift;
+
+ my $type = $self->type_constraint
+ or return 1;
+ my $constraint = $self->find_type_constraint
+ or return 1;
+
+ return 1 if $constraint->($_);
+
+ my $name = $self->name;
+ Carp::confess("Attribute ($name) does not pass the type constraint because: Validation failed for \'$type\' failed with value $_");
+}
+
1;
__END__