use
5.006_002;
our
$VERSION
=
'0.27'
;
warnings::warnif(
'deprecated'
,
'Any::Moose is deprecated. Please use Moo instead'
);
our
$PREFERRED
;
do
{
local
$@;
if
(
$ENV
{ANY_MOOSE}) {
$PREFERRED
=
$ENV
{
'ANY_MOOSE'
};
warn
"ANY_MOOSE is not set to Moose or Mouse"
unless
$PREFERRED
eq
'Moose'
||
$PREFERRED
eq
'Mouse'
;
if
(
$PREFERRED
eq
'Moose'
&& !
eval
{
require
Moose }) {
warn
"\$ANY_MOOSE is set to Moose but we cannot load it"
;
}
elsif
(
$PREFERRED
eq
'Mouse'
&& !
eval
{
require
Mouse }) {
warn
"\$ANY_MOOSE is set to Mouse but we cannot load it"
;
}
}
elsif
(
$INC
{
'Moo.pm'
} &&
eval
{
require
Moose } ) {
$PREFERRED
=
'Moose'
;
}
elsif
(_is_moose_loaded()) {
$PREFERRED
=
'Moose'
;
}
elsif
(
eval
{
require
Mouse;
require
Mouse::Util; Mouse::Util->can(
'get_metaclass_by_name'
) }) {
$PREFERRED
=
'Mouse'
;
}
elsif
(
eval
{
require
Moose }) {
$PREFERRED
=
'Moose'
;
}
else
{
warn
"Unable to locate Mouse or Moose in INC"
;
}
};
sub
import
{
my
$self
=
shift
;
my
$pkg
=
caller
;
strict->
import
;
warnings->
import
;
unshift
@_
,
'Moose'
if
!
@_
||
ref
(
$_
[0]);
while
(
my
$module
=
shift
) {
my
$options
=
@_
&&
ref
(
$_
[0]) ?
shift
: [];
$options
=
$self
->_canonicalize_options(
module
=>
$module
,
options
=>
$options
,
package
=>
$pkg
,
);
$self
->_install_module(
$options
);
}
no
strict
'refs'
;
*{
$pkg
.
'::any_moose'
} = \
&any_moose
;
}
sub
unimport {
my
$sel
=
shift
;
my
$pkg
=
caller
;
my
$module
;
if
(
@_
){
$module
= any_moose(
shift
,
$pkg
);
}
else
{
$module
= _backer_of(
$pkg
);
}
my
$e
=
do
{
local
$@;
eval
"package $pkg;\n"
.
'$module->unimport();'
;
$@;
};
if
(
$e
) {
Carp::croak(
"Cannot unimport Any::Moose: $e"
);
}
return
;
}
sub
_backer_of {
my
$pkg
=
shift
;
if
(
exists
$INC
{
'Mouse.pm'
}
and Mouse::Util->can(
'get_metaclass_by_name'
)
){
my
$meta
= Mouse::Util::get_metaclass_by_name(
$pkg
);
if
(
$meta
) {
return
'Mouse::Role'
if
$meta
->isa(
'Mouse::Meta::Role'
);
return
'Mouse'
if
$meta
->isa(
'Mouse::Meta::Class'
);
}
}
if
(_is_moose_loaded()) {
my
$meta
= Class::MOP::get_metaclass_by_name(
$pkg
);
if
(
$meta
) {
return
'Moose::Role'
if
$meta
->isa(
'Moose::Meta::Role'
);
return
'Moose'
if
$meta
->isa(
'Moose::Meta::Class'
);
}
}
return
undef
;
}
sub
_canonicalize_options {
my
$self
=
shift
;
my
%args
=
@_
;
my
%options
;
if
(
ref
(
$args
{options}) eq
'HASH'
) {
%options
= %{
$args
{options} };
}
else
{
%options
= (
imports
=>
$args
{options},
);
}
$options
{
package
} =
$args
{
package
};
$options
{module} = any_moose(
$args
{module},
$args
{
package
});
return
\
%options
;
}
sub
_install_module {
my
$self
=
shift
;
my
$options
=
shift
;
my
$module
=
$options
->{module};
(
my
$file
=
$module
.
'.pm'
) =~ s{::}{/}g;
require
$file
;
my
$e
=
do
{
local
$@;
eval
"package $options->{package};\n"
.
'$module->import(@{ $options->{imports} });'
;
$@;
};
if
(
$e
) {
Carp::croak(
"Cannot import Any::Moose: $e"
);
}
return
;
}
sub
any_moose {
my
$fragment
= _canonicalize_fragment(
shift
);
my
$package
=
shift
||
caller
;
my
$backer
= _backer_of(
$package
) ||
''
;
if
(
$backer
=~ /^Mouse/) {
$fragment
=~ s/^Moose/Mouse/;
return
$fragment
;
}
return
$fragment
if
$backer
=~ /^Moose/;
$fragment
=~ s/^Moose/Mouse/
if
mouse_is_preferred();
return
$fragment
;
}
for
my
$name
(
qw/
load_class
is_class_loaded
class_of
get_metaclass_by_name
get_all_metaclass_instances
get_all_metaclass_names
load_first_existing_class
/
) {
no
strict
'refs'
;
*{__PACKAGE__.
"::$name"
} = moose_is_preferred()
? *{
"Class::MOP::$name"
}
: *{
"Mouse::Util::$name"
};
}
sub
moose_is_preferred {
$PREFERRED
eq
'Moose'
}
sub
mouse_is_preferred {
$PREFERRED
eq
'Mouse'
}
sub
_is_moose_loaded {
exists
$INC
{
'Moose.pm'
} }
sub
is_moose_loaded {
warnings::warnif(
'deprecated'
,
"Any::Moose::is_moose_loaded is deprecated. Please use Any::Moose::moose_is_preferred instead"
);
goto
\
&_is_moose_loaded
;
}
sub
_canonicalize_fragment {
my
$fragment
=
shift
;
return
'Moose'
if
!
$fragment
;
$fragment
=~ s/^X::/MooseX::/;
$fragment
=~ s/^::/Moose::/;
$fragment
=~ s/^Mouse(X?)\b/Moose$1/;
$fragment
=~ s/^(?!Moose)/Moose::/;
return
$fragment
;
}
1;