Moo

 view release on metacpan or  search on metacpan

lib/Moo.pm  view on Meta::CPAN

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 )