File Coverage

blib/lib/Any/Moose.pm
Criterion Covered Total %
statement 84 97 86.6
branch 21 36 58.3
condition 9 14 64.2
subroutine 15 16 93.7
pod 0 4 0.0
total 129 167 77.2


line stmt bran cond sub pod time code
1             package Any::Moose; # git description: v0.25-2-g151f81b
2             # ABSTRACT: (DEPRECATED) use Moo instead!
3             # KEYWORDS: deprecated Moose Mouse abstraction layer object-oriented
4             $Any::Moose::VERSION = '0.26';
5 11     11   279744 use 5.006_002;
  11         30  
  11         355  
6 11     11   42 use strict;
  11         16  
  11         338  
7 11     11   45 use warnings;
  11         15  
  11         3053  
8              
9             # decide which backend to use
10             our $PREFERRED;
11             do {
12             local $@;
13             if ($ENV{ANY_MOOSE}) {
14             $PREFERRED = $ENV{'ANY_MOOSE'};
15             warn "ANY_MOOSE is not set to Moose or Mouse"
16             unless $PREFERRED eq 'Moose'
17             || $PREFERRED eq 'Mouse';
18              
19             # if we die here, then perl gives "unknown error" which doesn't tell
20             # you what the problem is at all. argh.
21             if ($PREFERRED eq 'Moose' && !eval { require Moose }) {
22             warn "\$ANY_MOOSE is set to Moose but we cannot load it";
23             }
24             elsif ($PREFERRED eq 'Mouse' && !eval { require Mouse }) {
25             warn "\$ANY_MOOSE is set to Mouse but we cannot load it";
26             }
27             }
28             elsif ( $INC{'Moo.pm'} && eval { require Moose } ) {
29             $PREFERRED = 'Moose';
30             }
31             elsif (_is_moose_loaded()) {
32             $PREFERRED = 'Moose';
33             }
34             elsif (eval { require Mouse; require Mouse::Util; Mouse::Util->can('get_metaclass_by_name') }) {
35             $PREFERRED = 'Mouse';
36             }
37             elsif (eval { require Moose }) {
38             $PREFERRED = 'Moose';
39             }
40             else {
41             require Carp;
42             warn "Unable to locate Mouse or Moose in INC";
43             }
44             };
45              
46             sub import {
47 16     16   2161 my $self = shift;
48 16         31 my $pkg = caller;
49              
50             # Any::Moose gives you strict and warnings
51 16         204 strict->import;
52 16         171 warnings->import;
53              
54             # first options are for Mo*se
55 16 100 66     102 unshift @_, 'Moose' if !@_ || ref($_[0]);
56              
57 16         50 while (my $module = shift) {
58 16 100 66     62 my $options = @_ && ref($_[0]) ? shift : [];
59              
60 16         49 $options = $self->_canonicalize_options(
61             module => $module,
62             options => $options,
63             package => $pkg,
64             );
65              
66 16         37 $self->_install_module($options);
67             }
68              
69             # give them any_moose too
70 11     11   72 no strict 'refs';
  11         14  
  11         6523  
71 16         25 *{$pkg.'::any_moose'} = \&any_moose;
  16         7539  
72             }
73              
74             sub unimport {
75 4     4   330 my $sel = shift;
76 4         9 my $pkg = caller;
77 4         4 my $module;
78              
79 4 100       13 if(@_){
80 1         5 $module = any_moose(shift, $pkg);
81             }
82             else {
83 3         7 $module = _backer_of($pkg);
84             }
85 4         13 my $e = do{
86 4         6 local $@;
87 4         232 eval "package $pkg;\n"
88             . '$module->unimport();';
89 4         283 $@;
90             };
91              
92 4 50       13 if ($e) {
93 0         0 require Carp;
94 0         0 Carp::croak("Cannot unimport Any::Moose: $e");
95             }
96              
97 4         2957 return;
98             }
99              
100             sub _backer_of {
101 24     24   26 my $pkg = shift;
102              
103 24 50 33     239 if(exists $INC{'Mouse.pm'}
104             and Mouse::Util->can('get_metaclass_by_name')
105             ){
106 24         146 my $meta = Mouse::Util::get_metaclass_by_name($pkg);
107 24 100       100 if ($meta) {
108 9 50       65 return 'Mouse::Role' if $meta->isa('Mouse::Meta::Role');
109 9 50       41 return 'Mouse' if $meta->isa('Mouse::Meta::Class');
110             }
111             }
112              
113 15 50       31 if (_is_moose_loaded()) {
114 0         0 my $meta = Class::MOP::get_metaclass_by_name($pkg);
115 0 0       0 if ($meta) {
116 0 0       0 return 'Moose::Role' if $meta->isa('Moose::Meta::Role');
117 0 0       0 return 'Moose' if $meta->isa('Moose::Meta::Class');
118             }
119             }
120              
121 15         68 return undef;
122             }
123              
124             sub _canonicalize_options {
125 16     16   23 my $self = shift;
126 16         52 my %args = @_;
127              
128 16         16 my %options;
129 16 50       65 if (ref($args{options}) eq 'HASH') {
130 0         0 %options = %{ $args{options} };
  0         0  
131             }
132             else {
133 16         38 %options = (
134             imports => $args{options},
135             );
136             }
137              
138 16         27 $options{package} = $args{package};
139 16         38 $options{module} = any_moose($args{module}, $args{package});
140              
141 16         44 return \%options;
142             }
143              
144             sub _install_module {
145 16     16   16 my $self = shift;
146 16         18 my $options = shift;
147              
148 16         23 my $module = $options->{module};
149 16         40 (my $file = $module . '.pm') =~ s{::}{/}g;
150              
151 16         457 require $file;
152              
153 16         739 my $e = do {
154 16         18 local $@;
155 16         1093 eval "package $options->{package};\n"
156             . '$module->import(@{ $options->{imports} });';
157 16         3228 $@;
158             };
159 16 50       45 if ($e) {
160 0         0 require Carp;
161 0         0 Carp::croak("Cannot import Any::Moose: $e");
162             }
163 16         67 return;
164             }
165              
166             sub any_moose {
167 21     21 0 852 my $fragment = _canonicalize_fragment(shift);
168 21   66     62 my $package = shift || caller;
169              
170             # Mouse gets first dibs because it doesn't introspect existing classes
171              
172 21   100     44 my $backer = _backer_of($package) || '';
173              
174 21 100       56 if ($backer =~ /^Mouse/) {
175 6         15 $fragment =~ s/^Moose/Mouse/;
176 6         17 return $fragment;
177             }
178              
179 15 50       32 return $fragment if $backer =~ /^Moose/;
180              
181 15 50       29 $fragment =~ s/^Moose/Mouse/ if mouse_is_preferred();
182 15         35 return $fragment;
183             }
184              
185             for my $name (qw/
186             load_class
187             is_class_loaded
188             class_of
189             get_metaclass_by_name
190             get_all_metaclass_instances
191             get_all_metaclass_names
192             load_first_existing_class
193             /) {
194 11     11   56 no strict 'refs';
  11         14  
  11         2838  
195             *{__PACKAGE__."::$name"} = moose_is_preferred()
196             ? *{"Class::MOP::$name"}
197             : *{"Mouse::Util::$name"};
198             }
199              
200 77     77 0 205 sub moose_is_preferred { $PREFERRED eq 'Moose' }
201 15     15 0 74 sub mouse_is_preferred { $PREFERRED eq 'Mouse' }
202              
203 27     27   2012 sub _is_moose_loaded { exists $INC{'Moose.pm'} }
204              
205             sub is_moose_loaded {
206 0     0 0 0 require Carp;
207 0         0 Carp::carp("Any::Moose::is_moose_loaded is deprecated. Please use Any::Moose::moose_is_preferred instead");
208 0         0 goto \&_is_moose_loaded;
209             }
210              
211             sub _canonicalize_fragment {
212 34     34   3882 my $fragment = shift;
213              
214 34 100       82 return 'Moose' if !$fragment;
215              
216             # any_moose("X::Types") -> any_moose("MooseX::Types")
217 30         60 $fragment =~ s/^X::/MooseX::/;
218              
219             # any_moose("::Util") -> any_moose("Moose::Util")
220 30         59 $fragment =~ s/^::/Moose::/;
221              
222             # any_moose("Mouse::Util") -> any_moose("Moose::Util")
223 30         59 $fragment =~ s/^Mouse(X?)\b/Moose$1/;
224              
225             # any_moose("Util") -> any_moose("Moose::Util")
226 30         65 $fragment =~ s/^(?!Moose)/Moose::/;
227              
228 30         53 return $fragment;
229             }
230              
231             1;
232              
233             __END__