From: Dave Rolsky Date: Thu, 19 Aug 2010 04:29:08 +0000 (+0200) Subject: Don't make a method object for calls to has_method, just for get_method X-Git-Tag: 1.05~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=1865cd32b3742abbe4fb52d43e950cae7bf32943;p=gitmo%2FClass-MOP.git Don't make a method object for calls to has_method, just for get_method This speeds things up a bit more, since we can check for the existence of a method without actually inflating a code ref into a method object. --- diff --git a/lib/Class/MOP/Mixin/HasMethods.pm b/lib/Class/MOP/Mixin/HasMethods.pm index d568e5a..032fb8d 100644 --- a/lib/Class/MOP/Mixin/HasMethods.pm +++ b/lib/Class/MOP/Mixin/HasMethods.pm @@ -89,7 +89,7 @@ sub has_method { ( defined $method_name && length $method_name ) || confess "You must define a method name"; - return defined( $self->get_method($method_name) ); + return defined( $self->_get_maybe_raw_method($method_name) ); } sub get_method { @@ -98,6 +98,21 @@ sub get_method { ( defined $method_name && length $method_name ) || confess "You must define a method name"; + my $method = $self->_get_maybe_raw_method($method_name) + or return; + + return $method if blessed $method; + + return $self->_method_map->{$method_name} = $self->wrap_method_body( + body => $method, + name => $method_name, + associated_metaclass => $self, + ); +} + +sub _get_maybe_raw_method { + my ( $self, $method_name ) = @_; + my $method_map = $self->_method_map; my $map_entry = $method_map->{$method_name}; my $code = $self->get_package_symbol( @@ -119,13 +134,7 @@ sub get_method { return unless $code && $self->_code_is_mine($code); } - $code ||= $map_entry; - - return $method_map->{$method_name} = $self->wrap_method_body( - body => $code, - name => $method_name, - associated_metaclass => $self, - ); + return $code; } sub remove_method {