X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo%2F_Utils.pm;h=1e53b0ec08f284b7542290b10d830baedbaf3e22;hb=0123201bb23a0510ae9ad5817a5138fc2eb0cb3e;hp=0e5d78704520e6dbcdd932a05b39dbc211f62264;hpb=b1eebd55fe3d34b6afa73a4880737dc91379b71e;p=gitmo%2FMoo.git diff --git a/lib/Moo/_Utils.pm b/lib/Moo/_Utils.pm index 0e5d787..1e53b0e 100644 --- a/lib/Moo/_Utils.pm +++ b/lib/Moo/_Utils.pm @@ -1,29 +1,45 @@ package Moo::_Utils; +sub _getglob { \*{$_[0]} } +sub _getstash { \%{"$_[0]::"} } + +BEGIN { + *lt_5_8_3 = $] < 5.008003 + ? sub () { 1 } + : sub () { 0 } + ; +} + use strictures 1; use base qw(Exporter); -our @EXPORT = qw(_getglob _install_modifier _maybe_load_module); - -sub _getglob { no strict 'refs'; \*{$_[0]} } +our @EXPORT = qw(_getglob _install_modifier _load_module _maybe_load_module); sub _install_modifier { - require Class::Method::Modifiers; my ($into, $type, $name, $code) = @_; - my $ref = ref(my $to_modify = $into->can($name)); - # if it isn't CODE, then either we're about to die, or it's a blessed - # coderef - if it's a blessed coderef it might be deferred, and the - # user's already doing something clever so a minor speed hit is meh. - - if ($ref && $ref ne 'CODE') { - require Sub::Defer; Sub::Defer::undefer_sub($to_modify); + if (my $to_modify = $into->can($name)) { # CMM will throw for us if not + require Sub::Defer; + Sub::Defer::undefer_sub($to_modify); } + Class::Method::Modifiers::install_modifier(@_); } our %MAYBE_LOADED; +# _load_module is inlined in Role::Tiny - make sure to copy if you update it. + +sub _load_module { + (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; +} + sub _maybe_load_module { return $MAYBE_LOADED{$_[0]} if exists $MAYBE_LOADED{$_[0]}; (my $proto = $_[0]) =~ s/::/\//g;