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 )