MooX-Role-Parameterized

 view release on metacpan or  search on metacpan

lib/MooX/Role/Parameterized.pm  view on Meta::CPAN


sub apply_roles_to_target {
    my ( $role, $args, %extra ) = @_;

    croak
      "unable to apply parameterized role: not an MooX::Role::Parameterized"
      if !__PACKAGE__->is_role($role);

    $args = [$args] if ref($args) ne ref( [] );

    my $target = defined( $extra{target} ) ? $extra{target} : (caller)[0];

    if (   exists $INFO{$role}
        && exists $INFO{$role}{code_for}
        && ref $INFO{$role}{code_for} eq "CODE" )
    {
        my $mop = MooX::Role::Parameterized::Mop->new(
            target => $target,
            role   => $role
        );

lib/MooX/Role/Parameterized.pm  view on Meta::CPAN

            }

            $INFO{$role}{code_for}->( $params, $mop );
        }
    }

    Moo::Role->apply_roles_to_package( $target, $role );
}

sub role(&) {    ##no critic (Subroutines::ProhibitSubroutinePrototypes)
    my $package = (caller)[0];

    $INFO{$package} ||= { is_role => 1 };

    croak "role subroutine called multiple times on '$package'"
      if exists $INFO{$package}{code_for};

    $INFO{$package}{code_for} = shift;
}

sub parameter {
    my $package = (caller)[0];

    $INFO{$package} ||= { is_role => 1 };

    push @{ $INFO{$package}{parameters_definition} ||= [] }, \@_;
}

sub is_role {
    my ( $klass, $role ) = @_;

    return !!( $INFO{$role} && $INFO{$role}->{is_role} );
}

sub build_apply_roles_to_package {
    my ( $klass, $orig ) = @_;

    return sub {
        my $target = (caller)[0];

        while (@_) {
            my $role = shift;

            eval { use_module($role) };

            if ( MooX::Role::Parameterized->is_role($role) ) {
                my $params = [ {} ];

                if ( @_ && ref $_[0] ) {



( run in 0.569 second using v1.01-cache-2.11-cpan-a3c8064c92c )