our
%NO_BUILD
;
our
%NO_DEMOLISH
;
our
$BUILD_MAKER
;
our
$DEMOLISH_MAKER
;
sub
new {
my
$class
=
shift
;
unless
(
exists
$NO_DEMOLISH
{
$class
}) {
unless
(
$NO_DEMOLISH
{
$class
} = !
$class
->can(
'DEMOLISH'
)) {
(
$DEMOLISH_MAKER
||=
do
{
Method::Generate::DemolishAll->new
})->generate_method(
$class
);
}
}
my
$proto
=
$class
->BUILDARGS(
@_
);
$NO_BUILD
{
$class
} and
return
bless
({},
$class
);
$NO_BUILD
{
$class
} = !
$class
->can(
'BUILD'
)
unless
exists
$NO_BUILD
{
$class
};
$NO_BUILD
{
$class
}
?
bless
({},
$class
)
:
bless
({},
$class
)->BUILDALL(
$proto
);
}
sub
BUILDARGS {
my
$class
=
shift
;
scalar
@_
== 1
?
ref
$_
[0] eq
'HASH'
? { %{
$_
[0] } }
: Carp::croak(
"Single parameters to new() must be a HASH ref"
.
" data => "
.
$_
[0])
:
@_
% 2
? Carp::croak(
"The new() method for $class expects a hash reference or a"
.
" key/value list. You passed an odd number of arguments"
)
: {
@_
}
;
}
sub
BUILDALL {
my
$self
=
shift
;
$self
->${\((
$BUILD_MAKER
||=
do
{
Method::Generate::BuildAll->new
})->generate_method(
ref
(
$self
)))}(
@_
);
}
sub
DEMOLISHALL {
my
$self
=
shift
;
$self
->${\((
$DEMOLISH_MAKER
||=
do
{
Method::Generate::DemolishAll->new
})->generate_method(
ref
(
$self
)))}(
@_
);
}
sub
does {
return
!!0
unless
(
$INC
{
'Moose/Role.pm'
} ||
$INC
{
'Role/Tiny.pm'
});
my
$does
= Moo::Role->can(
"does_role"
);
{
no
warnings
'redefine'
;
*does
=
$does
}
goto
&$does
;
}
sub
meta {
my
$class
=
ref
(
$_
[0])||
$_
[0];
bless
({
name
=>
$class
},
'Moo::HandleMoose::FakeMetaClass'
);
}
1;