From: Jesse Luehrs Date: Mon, 27 Sep 2010 07:37:55 +0000 (-0500) Subject: ugh, hacks X-Git-Tag: 1.09~20 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=80076f1e7b4ff4dcc19ae5844e3179d4b6c06352;p=gitmo%2FClass-MOP.git ugh, hacks --- diff --git a/lib/Class/MOP/Mixin/HasMethods.pm b/lib/Class/MOP/Mixin/HasMethods.pm index bd28e40..d496ddf 100644 --- a/lib/Class/MOP/Mixin/HasMethods.pm +++ b/lib/Class/MOP/Mixin/HasMethods.pm @@ -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); } }