X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FClass.pm;h=e9670f73f3f4e4fb0d593c38c8496aeff8b653af;hb=d7af0635808345e889e9a84907d37b7be69a3fb1;hp=f15125874f80aec47b841f4ec87f6e3700d8faa2;hpb=21f1e23149cf11f1259e7a008dba1bd9a6402e6a;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Class.pm b/lib/Moose/Meta/Class.pm index f151258..e9670f7 100644 --- a/lib/Moose/Meta/Class.pm +++ b/lib/Moose/Meta/Class.pm @@ -9,7 +9,7 @@ use Class::MOP; use Carp 'confess'; use Scalar::Util 'weaken', 'blessed'; -our $VERSION = '0.24'; +our $VERSION = '0.56'; our $AUTHORITY = 'cpan:STEVAN'; use Moose::Meta::Method::Overriden; @@ -121,15 +121,16 @@ sub excludes_role { } sub new_object { - my ($class, %params) = @_; - my $self = $class->SUPER::new_object(%params); + my $class = shift; + my $params = @_ == 1 ? $_[0] : {@_}; + my $self = $class->SUPER::new_object($params); foreach my $attr ($class->compute_all_applicable_attributes()) { # if we have a trigger, then ... if ($attr->can('has_trigger') && $attr->has_trigger) { # make sure we have an init-arg ... if (defined(my $init_arg = $attr->init_arg)) { # now make sure an init-arg was passes ... - if (exists $params{$init_arg}) { + if (exists $params->{$init_arg}) { # and if get here, fire the trigger $attr->trigger->( $self, @@ -140,7 +141,7 @@ sub new_object { ? $attr->get_read_method_ref->($self) # otherwise, just get the value from # the constructor params - : $params{$init_arg}), + : $params->{$init_arg}), $attr ); } @@ -151,15 +152,16 @@ sub new_object { } sub construct_instance { - my ($class, %params) = @_; + my $class = shift; + my $params = @_ == 1 ? $_[0] : {@_}; my $meta_instance = $class->get_meta_instance; # FIXME: # the code below is almost certainly incorrect # but this is foreign inheritence, so we might # have to kludge it in the end. - my $instance = $params{'__INSTANCE__'} || $meta_instance->create_instance(); + my $instance = $params->{'__INSTANCE__'} || $meta_instance->create_instance(); foreach my $attr ($class->compute_all_applicable_attributes()) { - $attr->initialize_instance_slot($meta_instance, $instance, \%params); + $attr->initialize_instance_slot($meta_instance, $instance, $params); } return $instance; } @@ -169,12 +171,15 @@ sub construct_instance { sub get_method_map { my $self = shift; - if (defined $self->{'$!_package_cache_flag'} && - $self->{'$!_package_cache_flag'} == Class::MOP::check_package_cache_flag($self->meta->name)) { - return $self->{'%!methods'}; + my $current = Class::MOP::check_package_cache_flag($self->name); + + if (defined $self->{'_package_cache_flag'} && $self->{'_package_cache_flag'} == $current) { + return $self->{'methods'}; } - my $map = $self->{'%!methods'}; + $self->{_package_cache_flag} = $current; + + my $map = $self->{'methods'}; my $class_name = $self->name; my $method_metaclass = $self->method_metaclass; @@ -282,6 +287,7 @@ sub _fix_metaclass_incompatability { foreach my $super (@superclasses) { # don't bother if it does not have a meta. next unless $super->can('meta'); + next unless $super->meta->isa("Class::MOP::Class"); # get the name, make sure we take # immutable classes into account my $super_meta_name = ($super->meta->is_immutable