} else {
$accessor .= $value.';';
}
- $accessor .= 'local $_ = $val;';
$accessor .= '
- unless ($constraint->()) {
- $attribute->verify_type_constraint_error($name, $_, $attribute->type_constraint);
+ unless ($constraint->($val)) {
+ $attribute->verify_type_constraint_error($name, $val, $attribute->type_constraint);
}' . "\n";
$value = '$val';
}
} else {
$code = $optimized_constraints->{ $spec };
if (! $code) {
- $code = sub { Scalar::Util::blessed($_) && $_->isa($spec) };
+ $code = sub { Scalar::Util::blessed($_[0]) && $_[0]->isa($spec) };
$optimized_constraints->{$spec} = $code;
}
}
_build_type_constraint($_)
} @type_constraints;
$code = sub {
+ local $_ = $_[0];
for my $code (@code_list) {
- return 1 if $code->();
+ return 1 if $code->($_);
}
return 0;
};
sub verify_type_constraint_error {
my($self, $name, $value, $type) = @_;
$type = ref($type) eq 'ARRAY' ? join '|', @{ $type } : $type;
- my $display = defined($_) ? overload::StrVal($_) : 'undef';
+ my $display = defined($value) ? overload::StrVal($value) : 'undef';
Carp::confess("Attribute ($name) does not pass the type constraint because: Validation failed for \'$type\' failed with value $display");
}
Any => sub { 1 },
Item => sub { 1 },
Bool => sub {
- !defined($_) || $_ eq "" || "$_" eq '1' || "$_" eq '0'
+ !defined($_[0]) || $_[0] eq "" || "$_[0]" eq '1' || "$_[0]" eq '0'
},
- Undef => sub { !defined($_) },
- Defined => sub { defined($_) },
- Value => sub { defined($_) && !ref($_) },
- Num => sub { !ref($_) && looks_like_number($_) },
- Int => sub { defined($_) && !ref($_) && /^-?[0-9]+$/ },
- Str => sub { defined($_) && !ref($_) },
- ClassName => sub { Mouse::is_class_loaded($_) },
- Ref => sub { ref($_) },
-
- ScalarRef => sub { ref($_) eq 'SCALAR' },
- ArrayRef => sub { ref($_) eq 'ARRAY' },
- HashRef => sub { ref($_) eq 'HASH' },
- CodeRef => sub { ref($_) eq 'CODE' },
- RegexpRef => sub { ref($_) eq 'Regexp' },
- GlobRef => sub { ref($_) eq 'GLOB' },
+ Undef => sub { !defined($_[0]) },
+ Defined => sub { defined($_[0]) },
+ Value => sub { defined($_[0]) && !ref($_[0]) },
+ Num => sub { !ref($_[0]) && looks_like_number($_[0]) },
+ Int => sub { defined($_[0]) && !ref($_[0]) && $_[0] =~ /^-?[0-9]+$/ },
+ Str => sub { defined($_[0]) && !ref($_[0]) },
+ ClassName => sub { Mouse::is_class_loaded($_[0]) },
+ Ref => sub { ref($_[0]) },
+
+ ScalarRef => sub { ref($_[0]) eq 'SCALAR' },
+ ArrayRef => sub { ref($_[0]) eq 'ARRAY' },
+ HashRef => sub { ref($_[0]) eq 'HASH' },
+ CodeRef => sub { ref($_[0]) eq 'CODE' },
+ RegexpRef => sub { ref($_[0]) eq 'Regexp' },
+ GlobRef => sub { ref($_[0]) eq 'GLOB' },
FileHandle => sub {
- ref($_) eq 'GLOB' && openhandle($_)
+ ref($_[0]) eq 'GLOB' && openhandle($_[0])
or
- blessed($_) && $_->isa("IO::Handle")
+ blessed($_[0]) && $_[0]->isa("IO::Handle")
},
- Object => sub { blessed($_) && blessed($_) ne 'Regexp' },
+ Object => sub { blessed($_[0]) && blessed($_[0]) ne 'Regexp' },
);
sub optimized_constraints { \%TYPE }
my $constraint = $conf{where} || do { $TYPE{delete $conf{as} || 'Any' } };
$TYPE_SOURCE{$name} = $pkg;
- $TYPE{$name} = $constraint;
+ $TYPE{$name} = sub { local $_=$_[0]; $constraint->($_) };
}
sub subtype {
$TYPE_SOURCE{$name} = $pkg;
if ($as = $TYPE{$as}) {
- $TYPE{$name} = sub { $as->($_) && $constraint->($_) };
+ $TYPE{$name} = sub { local $_=$_[0]; $as->($_) && $constraint->($_) };
} else {
- $TYPE{$name} = $constraint;
+ $TYPE{$name} = sub { local $_=$_[0]; $constraint->($_) };
}
}
next unless $COERCE{$type};
for my $coerce_type (@{ $COERCE_KEYS{$type}}) {
$_ = $value;
- next unless $TYPE{$coerce_type}->();
+ next unless $TYPE{$coerce_type}->($value);
$_ = $value;
- $_ = $COERCE{$type}->{$coerce_type}->();
- return $_ if $type_constraint->();
+ $_ = $COERCE{$type}->{$coerce_type}->($value);
+ return $_ if $type_constraint->($_);
}
}
return $value;
Returns the simple type constraints that Mouse understands.
+=head1 FUNCTIONS
+
+=over 4
+
+=item B<subtype 'Name' => as 'Parent' => where { } ...>
+
+=item B<subtype as 'Parent' => where { } ...>
+
+=item B<class_type ($class, ?$options)>
+
+=item B<role_type ($role, ?$options)>
+
+=item B<enum (\@values)>
+
+=back
+
=cut