When inlining constructor, don't access meta instance directly, use metaclass to...
[gitmo/Class-MOP.git] / lib / Class / MOP / Class.pm
index 15f6801..b3b6b97 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::MiniTrait;
 
 use Carp         'confess';
 use Scalar::Util 'blessed', 'reftype', 'weaken';
@@ -483,6 +484,7 @@ sub create {
         superclasses
         attributes
         methods
+        no_meta
         version
         authority
     )};
@@ -501,7 +503,7 @@ sub create {
                 if caller =~ /Class::MOP|metaclass/;
         }
         $class->initialize(ref($_[0]) || $_[0]);
-    });
+    }) unless $options{no_meta};
 
     $meta->superclasses(@{$options{superclasses}})
         if exists $options{superclasses};
@@ -611,6 +613,13 @@ sub _create_meta_instance {
     return $instance;
 }
 
+sub inline_create_instance {
+    my $self = shift;
+    my ($class) = @_;
+
+    return $self->get_meta_instance->inline_create_instance($class);
+}
+
 sub clone_object {
     my $class    = shift;
     my $instance = shift;
@@ -1176,17 +1185,7 @@ sub _immutable_metaclass {
         superclasses => [ ref $self ],
     );
 
-    Class::MOP::load_class($trait);
-    for my $meth ( Class::MOP::Class->initialize($trait)->get_all_methods ) {
-        my $meth_name = $meth->name;
-
-        if ( $immutable_meta->find_method_by_name( $meth_name ) ) {
-            $immutable_meta->add_around_method_modifier( $meth_name, $meth->body );
-        }
-        else {
-            $immutable_meta->add_method( $meth_name, $meth->clone );
-        }
-    }
+    Class::MOP::MiniTrait::apply( $immutable_meta, $trait );
 
     $immutable_meta->make_immutable(
         inline_constructor => 0,
@@ -1410,6 +1409,10 @@ hash reference are method names and values are subroutine references.
 
 An optional array reference of L<Class::MOP::Attribute> objects.
 
+=item * no_meta
+
+If true, a C<meta> method will not be installed into the class.
+
 =back
 
 =item B<< Class::MOP::Class->create_anon_class(%options) >>
@@ -1521,6 +1524,11 @@ metaclass.
 Returns an instance of the C<instance_metaclass> to be used in the
 construction of a new instance of the class.
 
+=item B<< $metaclass->inline_create_instance($class_var) >>
+
+This method takes a variable name, and uses it create an inline snippet of
+code that will create a new instance of the class.
+
 =back
 
 =head2 Informational predicates