fix _load_module to deal with subpackages correctly
[gitmo/Moo.git] / lib / Moo / _Utils.pm
index 6bf8f22..aaa903a 100644 (file)
@@ -1,12 +1,13 @@
 package Moo::_Utils;
 
+sub _getglob { \*{$_[0]} }
+sub _getstash { \%{"$_[0]::"} }
+
 use strictures 1;
 use base qw(Exporter);
 
 our @EXPORT = qw(_getglob _install_modifier _load_module _maybe_load_module);
 
-sub _getglob { no strict 'refs'; \*{$_[0]} }
-
 sub _install_modifier {
   my ($into, $type, $name, $code) = @_;
 
@@ -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;
 }