fix constructor firing for nonMoo through multiple layers of Moo
Matt S Trout [Sat, 8 Jan 2011 06:14:54 +0000 (06:14 +0000)]
Changes
lib/Moo.pm
t/extends-non-moo.t

diff --git a/Changes b/Changes
index 51ad7f0..f825bfb 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,4 @@
+  - Fix nonMoo constructor firing through multiple layers of Moo
   - Fix bug where nonMoo is mistakenly detected given a Moo superclass
     with no attributes (and hence no own constructor)
 
index 2c02cf2..33d33ac 100644 (file)
@@ -74,7 +74,6 @@ sub _constructor_maker_for {
         $moo_constructor = 1; # no other constructor, make a Moo one
       }
     };
-    require Moo::_mro unless $moo_constructor;
     Method::Generate::Constructor
       ->new(
         package => $target,
@@ -82,8 +81,11 @@ sub _constructor_maker_for {
           require Method::Generate::Accessor;
           Method::Generate::Accessor->new;
         },
-        ($moo_constructor ? ()
-          : (construction_string => '$class->next::method(@_)'))
+        construction_string => (
+          $moo_constructor
+            ? ($con ? $con->construction_string : undef)
+            : ('$class->'.$target.'::SUPER::new(@_)')
+        )
       )
       ->install_delayed
       ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}})
index 9c6beb1..17d87fd 100644 (file)
@@ -30,6 +30,11 @@ use Test::More;
     use Moo;
     extends 't::moo::extends_non_moo::middle';
     has 'attr' => (is=>'ro');
+
+    package t::moo::extends_non_moo::second_level_moo;
+    use Moo;
+    extends 't::moo::extends_non_moo::moo_with_attr';
+    has 'attr2' => (is=>'ro');
 }
 
 ok my $app = 100,
@@ -53,4 +58,10 @@ ok $app = t::moo::extends_non_moo::moo_with_attr->wrap($app),
 is $app, 100,
   '$app still 100';
 
+ok $app = t::moo::extends_non_moo::second_level_moo->wrap($app),
+  '$app from $app';
+
+is $app, 100,
+  '$app still 100';
+
 done_testing();