Add _get_local_methods method that returns method objects directly.
Dave Rolsky [Sat, 14 Aug 2010 17:28:33 +0000 (19:28 +0200)]
Using this in various places can make our code much more efficient, since we
avoid calling get_method twice.

lib/Class/MOP/Class.pm
lib/Class/MOP/Mixin/HasMethods.pm

index d383e20..b1678a9 100644 (file)
@@ -944,8 +944,7 @@ sub get_all_methods {
     for my $class ( reverse $self->linearized_isa ) {
         my $meta = Class::MOP::Class->initialize($class);
 
-        $methods{$_} = $meta->get_method($_)
-            for $meta->get_method_list;
+        $methods{ $_->name } = $_ for $meta->_get_local_methods;
     }
 
     return values %methods;
index bc5b09c..b8ea9ff 100644 (file)
@@ -156,6 +156,18 @@ sub get_method_list {
         keys %{$namespace};
 }
 
+# This should probably be what get_method_list actually does, instead of just
+# returning names. This was created as a much faster alternative to
+# $meta->get_method($_) for $meta->get_method_list
+sub _get_local_methods {
+    my $self = shift;
+
+    my $namespace = $self->namespace;
+
+    return map { $self->get_method($_) } grep { *{ $namespace->{$_} }{CODE} }
+        keys %{$namespace};
+}
+
 1;
 
 __END__