If the constructor in a parent class has method modifiers, we will not
Dave Rolsky [Fri, 5 Dec 2008 02:15:40 +0000 (02:15 +0000)]
inline it. In that case, mention the fact that it is wrapped in the
warning.

lib/Moose/Meta/Method/Constructor.pm
t/300_immutable/011_constructor_is_wrapped.t [new file with mode: 0644]

index 2357fe8..50b3bf2 100644 (file)
@@ -79,9 +79,15 @@ sub can_be_inlined {
         my $class = $self->associated_metaclass->name;
 
         if ( $constructor->body != $expected_class->can('new') ) {
-            warn "Not inlining a constructor for $class since it is not"
+            my $warning
+                = "Not inlining a constructor for $class since it is not"
                 . " inheriting the default $expected_class constructor\n";
 
+            $warning .= " (constructor has method modifiers which would be lost if it were inlined)\n"
+                if $constructor->isa('Class::MOP::Method::Wrapped');
+
+            warn $warning;
+
             return 0;
         }
         else {
diff --git a/t/300_immutable/011_constructor_is_wrapped.t b/t/300_immutable/011_constructor_is_wrapped.t
new file mode 100644 (file)
index 0000000..5b7ddfb
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+eval "use Test::Output";
+plan skip_all => "Test::Output is required for this test" if $@;
+
+plan tests => 1;
+
+{
+    package ModdedNew;
+    use Moose;
+
+    before 'new' => sub { };
+}
+
+{
+    package Foo;
+    use Moose;
+
+    extends 'ModdedNew';
+
+    ::stderr_is(
+        sub { Foo->meta->make_immutable },
+        "Not inlining a constructor for Foo since it is not inheriting the default Moose::Object constructor\n (constructor has method modifiers which would be lost if it were inlined)\n",
+        'got a warning that Foo may not have an inlined constructor'
+    );
+}