Add a can_be_inlined method to CMOP::Method::Constructor which we
Dave Rolsky [Thu, 4 Dec 2008 20:35:53 +0000 (20:35 +0000)]
check in CMOP::Immutable.

We will override this in Moose to only inline the constructor if our
class wants to use the one from Moose::Object.

lib/Class/MOP/Immutable.pm
lib/Class/MOP/Method/Constructor.pm

index eda19ba..47e1bac 100644 (file)
@@ -147,17 +147,16 @@ sub _inline_constructor {
     my $constructor_class = $options->{constructor_class}
         || 'Class::MOP::Method::Constructor';
 
-    $metaclass->add_method(
-        $options->{constructor_name},
-        $constructor_class->new(
-            options      => $options,
-            metaclass    => $metaclass,
-            is_inline    => 1,
-            package_name => $metaclass->name,
-            name         => $options->{constructor_name}
-        )
+    my $constructor = $constructor_class->new(
+        options      => $options,
+        metaclass    => $metaclass,
+        is_inline    => 1,
+        package_name => $metaclass->name,
+        name         => $options->{constructor_name},
     );
 
+    $metaclass->add_method( $options->{constructor_name} => $constructor )
+        if $constructor->can_be_inlined;
 }
 
 sub _inline_destructor {
index db506b8..f14c035 100644 (file)
@@ -52,6 +52,8 @@ sub _new {
     }, $class;
 }
 
+sub can_be_inlined { 1 }
+
 ## accessors
 
 sub options              { (shift)->{'options'}              }
@@ -227,6 +229,12 @@ metaclass which is passed into C<new>.
 This returns a boolean, but since constructors are very rarely
 not inlined, this always returns true for now.
 
+=item B<can_be_inlined>
+
+This method always returns true in this class. It exists so that
+subclasses (like in Moose) can override and do some sort of checking
+to determine whether or not inlining the constructor is safe.
+
 =item B<initialize_body>
 
 This creates the code reference for the constructor itself.