Method modifier tweaks. Add missing Wrapped::_new()
gfx [Thu, 16 Jul 2009 00:07:06 +0000 (09:07 +0900)]
lib/Class/MOP/Class.pm
lib/Class/MOP/Method/Wrapped.pm

index 3bf20ef..3a965c3 100644 (file)
@@ -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;
index 9f49e75..4e72a59 100644 (file)
@@ -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 {