fix _load_module to deal with subpackages correctly
matthewt [Sun, 5 Dec 2010 18:53:10 +0000 (18:53 +0000)]
Changes
lib/Moo/_Utils.pm

diff --git a/Changes b/Changes
index 5e820b5..56a0061 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,5 @@
+  - Fix _load_module to deal with pre-existing subpackages
+
 0.9.2 Wed Nov 17 2010
   - Add explanation of Moo's existence
   - Change @ISA setting mechanism to deal with a big in 5.10.0's get_linear_isa
index 82ecfcb..aaa903a 100644 (file)
@@ -1,6 +1,7 @@
 package Moo::_Utils;
 
 sub _getglob { \*{$_[0]} }
+sub _getstash { \%{"$_[0]::"} }
 
 use strictures 1;
 use base qw(Exporter);
@@ -21,8 +22,11 @@ sub _install_modifier {
 our %MAYBE_LOADED;
 
 sub _load_module {
-  return 1 if $_[0]->can('can');
   (my $proto = $_[0]) =~ s/::/\//g;
+  return 1 if $INC{"${proto}.pm"};
+  # can't just ->can('can') because a sub-package Foo::Bar::Baz
+  # creates a 'Baz::' key in Foo::Bar's symbol table
+  return 1 if grep !/::$/, keys %{_getstash($_[0])||{}};
   require "${proto}.pm";
   return 1;
 }