RogersMine

 view release on metacpan or  search on metacpan

local/lib/perl5/Moo/Role.pm  view on Meta::CPAN

  if ($INC{'Sub/Defer.pm'}) {
    Sub::Defer::undefer_package($role);
  }
}

sub role_application_steps {
  qw(_handle_constructor _undefer_subs _maybe_make_accessors),
    $_[0]->SUPER::role_application_steps;
}

sub apply_roles_to_package {
  my ($me, $to, @roles) = @_;
  foreach my $role (@roles) {
    _load_module($role);
    $me->_inhale_if_moose($role);
    croak "${role} is not a Moo::Role" unless $me->is_role($role);
  }
  $me->SUPER::apply_roles_to_package($to, @roles);
}

sub apply_single_role_to_package {
  my ($me, $to, $role) = @_;
  _load_module($role);
  $me->_inhale_if_moose($role);
  croak "${role} is not a Moo::Role" unless $me->is_role($role);
  $me->SUPER::apply_single_role_to_package($to, $role);
}

sub create_class_with_roles {
  my ($me, $superclass, @roles) = @_;

  my ($new_name, $compose_name) = $me->_composite_name($superclass, @roles);

  return $new_name if $COMPOSED{class}{$new_name};

  foreach my $role (@roles) {
    _load_module($role);
    $me->_inhale_if_moose($role);
    croak "${role} is not a Moo::Role" unless $me->is_role($role);
  }

  my $m;
  if ($INC{"Moo.pm"}
      and $m = Moo->_accessor_maker_for($superclass)
      and ref($m) ne 'Method::Generate::Accessor') {
    # old fashioned way time.
    @{*{_getglob("${new_name}::ISA")}{ARRAY}} = ($superclass);
    $Moo::MAKERS{$new_name} = {is_class => 1};
    $me->apply_roles_to_package($new_name, @roles);
  }
  else {
    $me->SUPER::create_class_with_roles($superclass, @roles);
    $Moo::MAKERS{$new_name} = {is_class => 1};
    $me->_handle_constructor($new_name, $_) for @roles;
  }

  if ($INC{'Moo/HandleMoose.pm'} && !$Moo::sification::disabled) {
    Moo::HandleMoose::inject_fake_metaclass_for($new_name);
  }
  $COMPOSED{class}{$new_name} = 1;
  _set_loaded($new_name, (caller)[1]);
  return $new_name;
}

sub apply_roles_to_object {
  my ($me, $object, @roles) = @_;
  my $new = $me->SUPER::apply_roles_to_object($object, @roles);
  my $class = ref $new;
  _set_loaded($class, (caller)[1]);

  my $apply_defaults = exists $APPLY_DEFAULTS{$class} ? $APPLY_DEFAULTS{$class}
    : $APPLY_DEFAULTS{$class} = do {
    my %attrs = map { @{$INFO{$_}{attributes}||[]} } @roles;

    if ($INC{'Moo.pm'}
        and keys %attrs
        and my $con_gen = Moo->_constructor_maker_for($class)
        and my $m = Moo->_accessor_maker_for($class)) {

      my $specs = $con_gen->all_attribute_specs;

      my %captures;
      my $code = join('',
        ( map {
          my $name = $_;
          my $spec = $specs->{$name};
          if ($m->has_eager_default($name, $spec)) {
            my ($has, $has_cap)
              = $m->generate_simple_has('$_[0]', $name, $spec);
            my ($set, $pop_cap)
              = $m->generate_use_default('$_[0]', $name, $spec, $has);

            @captures{keys %$has_cap, keys %$pop_cap}
              = (values %$has_cap, values %$pop_cap);
            "($set),";
          }
          else {
            ();
          }
        } sort keys %attrs ),
      );
      if ($code) {
        require Sub::Quote;
        Sub::Quote::quote_sub(
          "${class}::_apply_defaults",
          "no warnings 'void';\n$code",
          \%captures,
          {
            package => $class,
            no_install => 1,
          }
        );
      }
      else {
        0;
      }
    }
    else {
      0;
    }
  };
  if ($apply_defaults) {
    local $Carp::Internal{+__PACKAGE__} = 1;
    local $Carp::Internal{$class} = 1;
    $new->$apply_defaults;
  }
  return $new;
}



( run in 1.508 second using v1.01-cache-2.11-cpan-54e63673c56 )