From: gfx Date: Thu, 16 Jul 2009 00:07:06 +0000 (+0900) Subject: Method modifier tweaks. Add missing Wrapped::_new() X-Git-Tag: 0.90~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7fe2c0b65ce511286856916fc8f245d2d3bc4f9c;p=gitmo%2FClass-MOP.git Method modifier tweaks. Add missing Wrapped::_new() --- diff --git a/lib/Class/MOP/Class.pm b/lib/Class/MOP/Class.pm index 3bf20ef..3a965c3 100644 --- a/lib/Class/MOP/Class.pm +++ b/lib/Class/MOP/Class.pm @@ -662,12 +662,17 @@ sub add_method { # and now make sure to wrap it # even if it is already wrapped # because we need a new sub ref - $method = $wrapped_metaclass->wrap($method); + $method = $wrapped_metaclass->wrap($method, + package_name => $self->name, + name => $method_name, + ); } else { # now make sure we wrap it properly - $method = $wrapped_metaclass->wrap($method) - unless $method->isa($wrapped_metaclass); + $method = $wrapped_metaclass->wrap($method, + package_name => $self->name, + name => $method_name, + ) unless $method->isa($wrapped_metaclass); } $self->add_method($method_name => $method); return $method; diff --git a/lib/Class/MOP/Method/Wrapped.pm b/lib/Class/MOP/Method/Wrapped.pm index 9f49e75..4e72a59 100644 --- a/lib/Class/MOP/Method/Wrapped.pm +++ b/lib/Class/MOP/Method/Wrapped.pm @@ -85,15 +85,35 @@ sub wrap { }, }; $_build_wrapped_method->($modifier_table); - my $method = $class->SUPER::wrap( + return $class->SUPER::wrap( sub { $modifier_table->{cache}->(@_) }, # get these from the original # unless explicitly overriden - package_name => $params{package_name} || $code->package_name, - name => $params{name} || $code->name, + package_name => $params{package_name} || $code->package_name, + name => $params{name} || $code->name, + + modifier_table => $modifier_table, ); - $method->{'modifier_table'} = $modifier_table; - $method; +} + +sub _new { + my $class = shift; + return Class::MOP::Class->initialize($class)->new_object(@_) + if $class ne __PACKAGE__; + + my $params = @_ == 1 ? $_[0] : {@_}; + + return bless { + # inherited from Class::MOP::Method + 'body' => $params->{body}, + 'associated_metaclass' => $params->{associated_metaclass}, + 'package_name' => $params->{package_name}, + 'name' => $params->{name}, + 'original_method' => $params->{original_method}, + + # defined in this class + 'modifier_table' => $params->{modifier_table} + } => $class; } sub get_original_method {