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 )