RogersMine
view release on metacpan or search on metacpan
local/lib/perl5/Moo.pm view on Meta::CPAN
package Moo;
use Moo::_strictures;
use Moo::_mro;
use Moo::_Utils qw(
_getglob
_getstash
_install_coderef
_install_modifier
_load_module
_set_loaded
_unimport_coderefs
);
use Scalar::Util qw(reftype);
use Carp qw(croak);
BEGIN {
our @CARP_NOT = qw(
Method::Generate::Constructor
Method::Generate::Accessor
Moo::sification
Moo::_Utils
Moo::Role
);
}
our $VERSION = '2.003004';
$VERSION =~ tr/_//d;
require Moo::sification;
Moo::sification->import;
our %MAKERS;
sub _install_tracked {
my ($target, $name, $code) = @_;
$MAKERS{$target}{exports}{$name} = $code;
_install_coderef "${target}::${name}" => "Moo::${name}" => $code;
}
sub import {
my $target = caller;
my $class = shift;
_set_loaded(caller);
strict->import;
warnings->import;
if ($INC{'Role/Tiny.pm'} and Role::Tiny->is_role($target)) {
croak "Cannot import Moo into a role";
}
$MAKERS{$target} ||= {};
_install_tracked $target => extends => sub {
$class->_set_superclasses($target, @_);
$class->_maybe_reset_handlemoose($target);
return;
};
_install_tracked $target => with => sub {
require Moo::Role;
Moo::Role->apply_roles_to_package($target, @_);
$class->_maybe_reset_handlemoose($target);
};
_install_tracked $target => has => sub {
my $name_proto = shift;
my @name_proto = ref $name_proto eq 'ARRAY' ? @$name_proto : $name_proto;
if (@_ % 2 != 0) {
croak "Invalid options for " . join(', ', map "'$_'", @name_proto)
. " attribute(s): even number of arguments expected, got " . scalar @_;
}
my %spec = @_;
foreach my $name (@name_proto) {
# Note that when multiple attributes specified, each attribute
# needs a separate \%specs hashref
my $spec_ref = @name_proto > 1 ? +{%spec} : \%spec;
$class->_constructor_maker_for($target)
->register_attribute_specs($name, $spec_ref);
$class->_accessor_maker_for($target)
->generate_method($target, $name, $spec_ref);
$class->_maybe_reset_handlemoose($target);
}
return;
};
foreach my $type (qw(before after around)) {
_install_tracked $target => $type => sub {
_install_modifier($target, $type, @_);
return;
};
}
return if $MAKERS{$target}{is_class}; # already exported into this package
my $stash = _getstash($target);
my @not_methods = map +(
!ref($_) ? *$_{CODE}||() : reftype($_) eq 'CODE' ? $_ : ()
), values %$stash;
@{$MAKERS{$target}{not_methods}={}}{@not_methods} = @not_methods;
$MAKERS{$target}{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);
}
}
( run in 0.614 second using v1.01-cache-2.11-cpan-aadc1410aed )