return $predicate;
}
+sub generate_can_predicate_for {
+ my($methods_ref, $name) = @_;
+
+ my @methods = @{$methods_ref};
+
+ my $predicate = sub{
+ my($instance) = @_;
+ if(Scalar::Util::blessed($instance)){
+ foreach my $method(@methods){
+ if(!$instance->can($method)){
+ return 0;
+ }
+ }
+ return 1;
+ }
+ return 0;
+ };
+
+ if(defined $name){
+ no strict 'refs';
+ *{ caller() . '::' . $name } = $predicate;
+ return;
+ }
+
+ return $predicate;
+}
package
Mouse::Util::TypeConstraints;
sub Value { defined($_[0]) && !ref($_[0]) }
sub Num { !ref($_[0]) && looks_like_number($_[0]) }
sub Int { defined($_[0]) && !ref($_[0]) && $_[0] =~ /^-?[0-9]+$/ }
-sub Str { defined($_[0]) && !ref($_[0]) }
+sub Str {
+ my($value) = @_;
+ return defined($value) && ref(\$value) eq 'SCALAR';
+}
sub Ref { ref($_[0]) }
-sub ScalarRef { ref($_[0]) eq 'SCALAR' }
+sub ScalarRef {
+ my($value) = @_;
+ return ref($value) eq 'SCALAR'
+}
sub ArrayRef { ref($_[0]) eq 'ARRAY' }
sub HashRef { ref($_[0]) eq 'HASH' }
sub CodeRef { ref($_[0]) eq 'CODE' }
sub GlobRef { ref($_[0]) eq 'GLOB' }
sub FileHandle {
- openhandle($_[0]) || (blessed($_[0]) && $_[0]->isa("IO::Handle"))
+ return openhandle($_[0]) || (blessed($_[0]) && $_[0]->isa("IO::Handle"))
}
sub Object { blessed($_[0]) && blessed($_[0]) ne 'Regexp' }
return;
}
+sub is_immutable { $_[0]->{is_immutable} }
package
Mouse::Meta::Role;
die $e if $e; # rethrow
}
+sub BUILDALL {
+ my $self = shift;
+
+ # short circuit
+ return unless $self->can('BUILD');
+
+ for my $class (reverse $self->meta->linearized_isa) {
+ my $build = Mouse::Util::get_code_ref($class, 'BUILD')
+ || next;
+
+ $self->$build(@_);
+ }
+ return;
+}
+
+sub DEMOLISHALL;
+*DEMOLISHALL = \&DESTROY;
+
1;
__END__
=head1 VERSION
-This document describes Mouse version 0.43
+This document describes Mouse version 0.46
=head1 SEE ALSO