ugh, hacks
Jesse Luehrs [Mon, 27 Sep 2010 07:37:55 +0000 (02:37 -0500)]
lib/Class/MOP/Mixin/HasMethods.pm

index bd28e40..d496ddf 100644 (file)
@@ -194,7 +194,21 @@ sub _restore_metamethods_from {
     my ($old_meta) = @_;
 
     for my $method ($old_meta->_get_local_methods) {
-        $method->_make_compatible_with($self->method_metaclass);
+        # XXX: this is pretty gross. the issue here is that
+        # CMOP::Method::Wrapped objects are subclasses of CMOP::Method, but
+        # when we get to moose, they'll need to be compatible with
+        # Moose::Meta::Method, which isn't possible. the right solution here is
+        # to make ::Wrapped into a role that gets applied to whatever the
+        # method_metaclass happens to be and get rid of
+        # wrapped_method_metaclass entirely, but that's not going to happen
+        # until we ditch cmop and get roles into the bootstrapping, so.
+        # i'm not maintaining the previous behavior of turning them into
+        # instances of the new method_metaclass because that's equally broken,
+        # and at least this way any issues will at least be detectable and
+        # potentially fixable. -doy
+        if (!$method->isa($self->wrapped_method_metaclass)) {
+            $method->_make_compatible_with($self->method_metaclass);
+        }
         $self->add_method($method->name => $method);
     }
 }