From: Jesse Luehrs Date: Mon, 27 Sep 2010 20:45:08 +0000 (-0500) Subject: let the method subclasses take care of their own hackery X-Git-Tag: 1.09~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5281e1f917fed9adeb2c4ec0855e26b41f974696;p=gitmo%2FClass-MOP.git let the method subclasses take care of their own hackery --- diff --git a/lib/Class/MOP/Method/Meta.pm b/lib/Class/MOP/Method/Meta.pm index d1bc316..92ac2c1 100644 --- a/lib/Class/MOP/Method/Meta.pm +++ b/lib/Class/MOP/Method/Meta.pm @@ -58,6 +58,25 @@ sub wrap { return $class->SUPER::wrap(%params); } +sub _make_compatible_with { + my $self = shift; + my ($other) = @_; + + # XXX: this is pretty gross. the issue here is that CMOP::Method::Meta + # 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 ::Meta into a role that gets applied to + # whatever the method_metaclass happens to be and get rid of + # _meta_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 + return $self unless $other->_is_compatible_with($self->_real_ref_name); + + return $self->SUPER::_make_compatible_with(@_); +} + 1; __END__ diff --git a/lib/Class/MOP/Method/Wrapped.pm b/lib/Class/MOP/Method/Wrapped.pm index 363d1fc..94c1a16 100644 --- a/lib/Class/MOP/Method/Wrapped.pm +++ b/lib/Class/MOP/Method/Wrapped.pm @@ -177,6 +177,25 @@ sub around_modifiers { return @{$code->{'modifier_table'}->{around}->{methods}}; } +sub _make_compatible_with { + my $self = shift; + my ($other) = @_; + + # 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 + return $self unless $other->_is_compatible_with($self->_real_ref_name); + + return $self->SUPER::_make_compatible_with(@_); +} + 1; __END__ diff --git a/lib/Class/MOP/Mixin/HasMethods.pm b/lib/Class/MOP/Mixin/HasMethods.pm index 1977d72..e3864a8 100644 --- a/lib/Class/MOP/Mixin/HasMethods.pm +++ b/lib/Class/MOP/Mixin/HasMethods.pm @@ -214,23 +214,7 @@ sub _restore_metamethods_from { my ($old_meta) = @_; for my $method ($old_meta->_get_local_methods) { - # 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) - # and the same issue occurs with CMOP::Method::Meta objects/: - && !$method->isa($self->_meta_method_class)) { - $method->_make_compatible_with($self->method_metaclass); - } + $method->_make_compatible_with($self->method_metaclass); $self->add_method($method->name => $method); } }