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__
if (!exists($args{$key})) {
if (exists($attribute->{default})) {
unless ($attribute->{lazy}) {
- if (ref($attribute->{default}) eq 'CODE') {
- $instance->{$key} = $attribute->{default}->();
- Scalar::Util::weaken($instance->{$key})
- if $attribute->{weak_ref};
- }
- else {
- $instance->{$key} = $attribute->{default};
- Scalar::Util::weaken($instance->{$key})
- if $attribute->{weak_ref};
- }
+ my $default = ref($attribute->{default}) eq 'CODE'
+ ? $attribute->{default}->()
+ : $attribute->{default};
+
+ $attribute->verify_type_constraint($default)
+ if $attribute->has_type_constraint;
+
+ $instance->{$key} = $default;
+
+ Scalar::Util::weaken($instance->{$key})
+ if $attribute->{weak_ref};
}
}
else {
}
if (exists($args{$key})) {
+ $attribute->verify_type_constraint($args{$key})
+ if $attribute->has_type_constraint;
+
$instance->{$key} = $args{$key};
+
Scalar::Util::weaken($instance->{$key})
if $attribute->{weak_ref};