slight speed improvements
[gitmo/Class-MOP.git] / lib / Class / MOP.pm
index ef130fc..5ed90a1 100644 (file)
@@ -179,27 +179,23 @@ Class::MOP::Class->meta->add_attribute(
 Class::MOP::Class->meta->add_attribute(
     Class::MOP::Attribute->new('%:methods' => (
         reader   => {          
-            # NOTE:
-            # as with the $VERSION and $AUTHORITY above
-            # sometimes we don't/can't store directly 
-            # inside the instance, so we need the accessor
-            # to just DWIM
             'get_method_map' => sub {
                 my $self = shift;
-                # FIXME:
-                # there is a faster/better way 
-                # to do this, I am sure :)
-                return +{ 
-                    map {
-                        $_ => $self->get_method($_) 
-                    } grep { 
-                        $self->has_method($_) 
-                    } $self->list_all_package_symbols
-                };            
+                my $map  = $self->{'%:methods'}; 
+
+                foreach my $symbol ($self->list_all_package_symbols('CODE')) {
+                    my $code = $self->get_package_symbol('&' . $symbol);
+                    
+                    next if exists $map->{$symbol} && 
+                            $map->{$symbol}->body == $code;
+
+                    $map->{$symbol} = $self->method_metaclass->wrap($code);
+                }
+
+                return $map;           
             }
         },
-        init_arg => '!............( DO NOT DO THIS )............!',
-        default  => sub { \undef }
+        default => sub { {} }
     ))
 );