X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse%2FPurePerl.pm;h=0003a9b3ee4c09a762c4070c091fd2555904835b;hp=802289d257e83fe750a4df8597e0f2d23064179b;hb=1194aedef7b9a3f8c4a36fd7060c27b1a2907b87;hpb=6514735e9b5d79f955badf9f50970ee768a44337 diff --git a/lib/Mouse/PurePerl.pm b/lib/Mouse/PurePerl.pm index 802289d..0003a9b 100644 --- a/lib/Mouse/PurePerl.pm +++ b/lib/Mouse/PurePerl.pm @@ -2,8 +2,7 @@ package Mouse::PurePerl; require Mouse::Util; -package - Mouse::Util; +package Mouse::Util; use strict; use warnings; @@ -12,6 +11,19 @@ use warnings FATAL => 'redefine'; # to avoid to load Mouse::PurePerl use B (); + +# taken from Class/MOP.pm +sub is_valid_class_name { + my $class = shift; + + return 0 if ref($class); + return 0 unless defined($class); + + return 1 if $class =~ /\A \w+ (?: :: \w+ )* \z/xms; + + return 0; +} + sub is_class_loaded { my $class = shift; @@ -89,8 +101,7 @@ sub generate_isa_predicate_for { my $predicate = sub{ Scalar::Util::blessed($_[0]) && $_[0]->isa($for_class) }; if(defined $name){ - no strict 'refs'; - *{ caller() . '::' . $name } = $predicate; + Mouse::Util::install_subroutines(scalar caller, $name => $predicate); return; } @@ -116,16 +127,14 @@ sub generate_can_predicate_for { }; if(defined $name){ - no strict 'refs'; - *{ caller() . '::' . $name } = $predicate; + Mouse::Util::install_subroutines(scalar caller, $name => $predicate); return; } return $predicate; } -package - Mouse::Util::TypeConstraints; +package Mouse::Util::TypeConstraints; use Scalar::Util qw(blessed looks_like_number openhandle); @@ -195,12 +204,9 @@ sub _parameterize_Maybe_for { return sub{ return !defined($_) || $check->($_); }; -}; - - +} -package - Mouse::Meta::Module; +package Mouse::Meta::Module; sub name { $_[0]->{package} } @@ -229,15 +235,13 @@ sub add_method { $self->{methods}->{$name} = $code; # Moose stores meta object here. - my $pkg = $self->name; - no strict 'refs'; - no warnings 'redefine', 'once'; - *{ $pkg . '::' . $name } = $code; + Mouse::Util::install_subroutines($self->name, + $name => $code, + ); return; } -package - Mouse::Meta::Class; +package Mouse::Meta::Class; sub method_metaclass { $_[0]->{method_metaclass} || 'Mouse::Meta::Method' } sub attribute_metaclass { $_[0]->{attribute_metaclass} || 'Mouse::Meta::Attribute' } @@ -325,8 +329,9 @@ sub _initialize_object{ sub is_immutable { $_[0]->{is_immutable} } -package - Mouse::Meta::Role; +sub __strict_constructor{ $_[0]->{strict_constructor} } + +package Mouse::Meta::Role; sub method_metaclass{ $_[0]->{method_metaclass} || 'Mouse::Meta::Role::Method' } @@ -336,8 +341,39 @@ sub is_anon_role{ sub get_roles { $_[0]->{roles} } -package - Mouse::Meta::Attribute; +sub add_before_method_modifier { + my ($self, $method_name, $method) = @_; + + push @{ $self->{before_method_modifiers}{$method_name} ||= [] }, $method; + return; +} +sub add_around_method_modifier { + my ($self, $method_name, $method) = @_; + + push @{ $self->{around_method_modifiers}{$method_name} ||= [] }, $method; + return; +} +sub add_after_method_modifier { + my ($self, $method_name, $method) = @_; + + push @{ $self->{after_method_modifiers}{$method_name} ||= [] }, $method; + return; +} + +sub get_before_method_modifiers { + my ($self, $method_name) = @_; + return @{ $self->{before_method_modifiers}{$method_name} ||= [] } +} +sub get_around_method_modifiers { + my ($self, $method_name) = @_; + return @{ $self->{around_method_modifiers}{$method_name} ||= [] } +} +sub get_after_method_modifiers { + my ($self, $method_name) = @_; + return @{ $self->{after_method_modifiers}{$method_name} ||= [] } +} + +package Mouse::Meta::Attribute; require Mouse::Meta::Method::Accessor; @@ -451,12 +487,23 @@ sub _process_options{ my $tc; if(exists $args->{isa}){ - $args->{type_constraint} = Mouse::Util::TypeConstraints::find_or_create_isa_type_constraint($args->{isa}); + $tc = $args->{type_constraint} = Mouse::Util::TypeConstraints::find_or_create_isa_type_constraint($args->{isa}); } - elsif(exists $args->{does}){ - $args->{type_constraint} = Mouse::Util::TypeConstraints::find_or_create_does_type_constraint($args->{does}); + + if(exists $args->{does}){ + if(defined $tc){ # both isa and does supplied + my $does_ok = do{ + local $@; + eval{ "$tc"->does($args) }; + }; + if(!$does_ok){ + $class->throw_error("Cannot have both an isa option and a does option because '$tc' does not do '$args->{does}' on attribute ($name)"); + } + } + else { + $tc = $args->{type_constraint} = Mouse::Util::TypeConstraints::find_or_create_does_type_constraint($args->{does}); + } } - $tc = $args->{type_constraint}; if($args->{coerce}){ defined($tc) @@ -504,18 +551,18 @@ sub _process_options{ } -package - Mouse::Meta::TypeConstraint; +package Mouse::Meta::TypeConstraint; sub name { $_[0]->{name} } sub parent { $_[0]->{parent} } sub message { $_[0]->{message} } +sub type_parameter { $_[0]->{type_parameter} } sub _compiled_type_constraint{ $_[0]->{compiled_type_constraint} } - sub _compiled_type_coercion { $_[0]->{_compiled_type_coercion} } -sub has_coercion{ exists $_[0]->{_compiled_type_coercion} } +sub __is_parameterized { exists $_[0]->{type_parameter} } +sub has_coercion { exists $_[0]->{_compiled_type_coercion} } sub compile_type_constraint{ @@ -564,9 +611,7 @@ sub compile_type_constraint{ return; } -package - Mouse::Object; - +package Mouse::Object; sub BUILDARGS { my $class = shift; @@ -615,7 +660,6 @@ sub DESTROY { my $e = do{ local $@; eval{ - # DEMOLISHALL # We cannot count on being able to retrieve a previously made @@ -664,7 +708,7 @@ Mouse::PurePerl - A Mouse guts in pure Perl =head1 VERSION -This document describes Mouse version 0.50 +This document describes Mouse version 0.50_03 =head1 SEE ALSO