factor out meta method generation
[gitmo/Class-MOP.git] / lib / Class / MOP / Class.pm
index 2dbd9f2..a1fc198 100644 (file)
@@ -8,6 +8,7 @@ use Class::MOP::Instance;
 use Class::MOP::Method::Wrapped;
 use Class::MOP::Method::Accessor;
 use Class::MOP::Method::Constructor;
+use Class::MOP::Method::Meta;
 use Class::MOP::MiniTrait;
 
 use Carp         'confess';
@@ -124,6 +125,17 @@ sub _real_ref_name {
         : ref $self;
 }
 
+sub _add_meta_method {
+    my $self = shift;
+    $self->add_method(
+        'meta' => Class::MOP::Method::Meta->wrap(
+            name                 => 'meta',
+            package_name         => $self->name,
+            associated_metaclass => $self,
+        )
+    );
+}
+
 sub _new {
     my $class = shift;
 
@@ -518,18 +530,7 @@ sub create {
 
     $meta->_instantiate_module( $options{version}, $options{authority} );
 
-    # FIXME totally lame
-    $meta->add_method('meta' => sub {
-        if (Class::MOP::DEBUG_NO_META()) {
-            my ($self) = @_;
-            if (my $meta = try { $self->SUPER::meta }) {
-                return $meta if $meta->isa('Class::MOP::Class');
-            }
-            confess "'meta' method called by MOP internals"
-                if caller =~ /Class::MOP|metaclass/;
-        }
-        $class->initialize(ref($_[0]) || $_[0]);
-    }) unless $options{no_meta};
+    $meta->_add_meta_method unless $options{no_meta};
 
     $meta->superclasses(@{$options{superclasses}})
         if exists $options{superclasses};