Fixes to accomodate a metaclass which is an anon subclass of something
Dave Rolsky [Tue, 30 Jun 2009 20:10:11 +0000 (15:10 -0500)]
like Moose::Meta::Class. This happens when you make your own metaclass
using Moose and then load modules which apply roles to the metaclass.

Also, when making the new metaclass immutable, don't inline the
constructor.

lib/Class/MOP/Class.pm

index 2a6f01c..9ba78e8 100644 (file)
@@ -1098,7 +1098,16 @@ sub _immutable_metaclass {
     return $class_name
         if Class::MOP::is_class_loaded($class_name);
 
-    my $meta = (ref $self)->create(
+    # If the metaclass is a subclass of CMOP::Class which has had
+    # metaclass roles applied (via Moose), then we want to make sure
+    # that we preserve that anonymous class (see Fey::ORM for an
+    # example of where this matters).
+    my $meta_name
+        = $self->meta->is_immutable
+        ? $self->meta->get_mutable_metaclass_name
+        : ref $self->meta;
+
+    my $meta = $meta_name->create(
         $class_name,
         superclasses => [ ref $self ],
     );
@@ -1115,7 +1124,7 @@ sub _immutable_metaclass {
         }
     }
 
-    $meta->make_immutable;
+    $meta->make_immutable( inline_constructor => 0 );
 
     return $class_name;
 }