Moo
view release on metacpan or search on metacpan
package Moo;
use strict;
use warnings;
no warnings 'once';
use Moo::_Utils qw(
_check_tracked
_getglob
_getstash
_install_coderef
_install_modifier
_install_tracked
_linear_isa
_load_module
_set_loaded
_unimport_coderefs
);
use Carp qw(croak);
BEGIN {
our @CARP_NOT = qw(
Method::Generate::Constructor
Method::Generate::Accessor
Moo::sification
Moo::_Utils
Moo::Role
);
}
our $VERSION = '2.005005';
$VERSION =~ tr/_//d;
require Moo::sification;
Moo::sification->import;
our %MAKERS;
sub import {
my $target = caller;
my $class = shift;
if ($INC{'Role/Tiny.pm'} and Role::Tiny->is_role($target)) {
croak "Cannot import Moo into a role";
}
_set_loaded(caller);
strict->import;
warnings->import;
$class->_install_subs($target, @_);
$class->make_class($target);
return;
}
sub make_class {
my ($me, $target) = @_;
my $makers = $MAKERS{$target} ||= {};
return $target if $makers->{is_class};
my $stash = _getstash($target);
$makers->{non_methods} = {
map +($_ => \&{"${target}::${_}"}),
grep exists &{"${target}::${_}"},
grep !/::\z/ && !/\A\(/,
keys %$stash
};
$makers->{is_class} = 1;
{
no strict 'refs';
@{"${target}::ISA"} = do {
require Moo::Object; ('Moo::Object');
} unless @{"${target}::ISA"};
}
if ($INC{'Moo/HandleMoose.pm'} && !$Moo::sification::disabled) {
Moo::HandleMoose::inject_fake_metaclass_for($target);
}
return $target;
}
sub is_class {
my ($me, $class) = @_;
return $MAKERS{$class} && $MAKERS{$class}{is_class};
}
sub _install_subs {
my ($me, $target) = @_;
my %install = $me->_gen_subs($target);
_install_tracked $target => $_ => $install{$_}
for sort keys %install;
return;
}
sub _gen_subs {
my ($me, $target) = @_;
return (
extends => sub {
$me->_set_superclasses($target, @_);
$me->_maybe_reset_handlemoose($target);
return;
},
with => sub {
require Moo::Role;
Moo::Role->apply_roles_to_package($target, @_);
$me->_maybe_reset_handlemoose($target);
},
( run in 2.404 seconds using v1.01-cache-2.11-cpan-d8267643d1d )