fix _load_module to deal with subpackages correctly
[gitmo/Moo.git] / lib / Moo / _Utils.pm
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;
 }