Reverse the output from _follow_also
Chris Prather [Tue, 15 Feb 2011 16:36:09 +0000 (11:36 -0500)]
Turns out when we follow the export tree we return the list in the order we
discovered, which is the inverse of the order we want. This wasn't ever a
problem before because nobody has tried exporting more than one level off of
Moose. Someone has now, so we need to reverse the entire list.

Also we have added tests for second-order exports (exporting overridden
exports)

lib/Moose/Exporter.pm
t/050_metaclasses/012_moose_exporter.t

index 40e73e1..472c092 100644 (file)
@@ -136,7 +136,7 @@ sub _make_exporter {
 
         local %$seen = ( $exporting_package => 1 );
 
-        return uniq( _follow_also_real($exporting_package) );
+        return reverse uniq( _follow_also_real($exporting_package) );
     }
 
     sub _follow_also_real {
index 98bde56..3635a8b 100644 (file)
@@ -267,11 +267,56 @@ use Test::Requires {
 }
 
 {
-    ok( ! WantsSugar->can('has'),  'WantsSugar::has() has been cleaned' );
-    ok( ! WantsSugar->can('with'), 'WantsSugar::with() has been cleaned' );
+    ok( ! WantsOverridingSugar->can('has'),  'WantsSugar::has() has been cleaned' );
+    ok( ! WantsOverridingSugar->can('with'), 'WantsSugar::with() has been cleaned' );
+}
+
+{
+    package MooseX::OverridingSugar::PassThru;
+    
+    sub with {
+        my $caller = shift->name;
+        return $caller . ' called with';
+    }
+    
+    Moose::Exporter->setup_import_methods(
+        with_meta => ['with'],
+        also      => 'MooseX::OverridingSugar',
+    );
+    
+}
+
+{
+
+    package WantsOverridingSugar::PassThru;
+
+    MooseX::OverridingSugar::PassThru->import();
+
+    ::can_ok( 'WantsOverridingSugar::PassThru', 'has' );
+    ::can_ok( 'WantsOverridingSugar::PassThru', 'with' );
+    ::is(
+        has('foo'),
+        'WantsOverridingSugar::PassThru called has',
+        'has from MooseX::OverridingSugar is called, not has from Moose'
+    );
+
+    ::is(
+        with('foo'),
+        'WantsOverridingSugar::PassThru called with',
+        'with from MooseX::OverridingSugar::PassThru is called, not has from Moose'
+    );
+
+
+    MooseX::OverridingSugar::PassThru->unimport();
+}
+
+{
+    ok( ! WantsOverridingSugar::PassThru->can('has'),  'WantsOverridingSugar::PassThru::has() has been cleaned' );
+    ok( ! WantsOverridingSugar::PassThru->can('with'), 'WantsOverridingSugar::PassThru::with() has been cleaned' );
 }
 
 {
+
     package NonExistentExport;
 
     use Moose ();