_load_module
[gitmo/Moo.git] / lib / Moo / _Utils.pm
1 package Moo::_Utils;
2
3 use strictures 1;
4 use base qw(Exporter);
5
6 our @EXPORT = qw(_getglob _install_modifier _load_module _maybe_load_module);
7
8 sub _getglob { no strict 'refs'; \*{$_[0]} }
9
10 sub _install_modifier {
11   my ($into, $type, $name, $code) = @_;
12   my $ref = ref(my $to_modify = $into->can($name));
13
14   require Sub::Defer;
15   Sub::Defer::undefer_sub($to_modify);
16
17   require Class::Method::Modifiers;
18   Class::Method::Modifiers::install_modifier(@_);
19 }
20
21 our %MAYBE_LOADED;
22
23 sub _load_module {
24   return 1 if $_[0]->can('can');
25   (my $proto = $_[0]) =~ s/::/\//g;
26   require "${proto}.pm";
27   return 1;
28 }
29
30 sub _maybe_load_module {
31   return $MAYBE_LOADED{$_[0]} if exists $MAYBE_LOADED{$_[0]};
32   (my $proto = $_[0]) =~ s/::/\//g;
33   if (eval { require "${proto}.pm"; 1 }) {
34     $MAYBE_LOADED{$_[0]} = 1;
35   } else {
36     if (exists $INC{"${proto}.pm"}) {
37       warn "$_[0] exists but failed to load with error: $@";
38     }
39     $MAYBE_LOADED{$_[0]} = 0;
40   }
41   return $MAYBE_LOADED{$_[0]};
42 }
43
44 1;