use MooseX::Role::Parameterized::Meta::Role::Parameterized;
use MooseX::Role::Parameterized::Parameters;
+use constant parameterized_role_metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterized';
+
has parameter_metaclass => (
is => 'rw',
isa => 'Moose::Meta::Class',
sub construct_parameters {
my $self = shift;
- $self->parameter_metaclass->construct_instance(@_);
+ $self->parameter_metaclass->new_object(@_);
}
sub generate_role {
my $self = shift;
- my %args = @_;
+
+ my $parameters = @_ == 1 ? shift
+ : $self->construct_parameters(@_);
confess "A role generator is required to generate roles"
unless $self->has_role_generator;
- my $parameters = $self->construct_parameters(%args);
-
- my $metaclass = Moose::Meta::Class->create_anon_class(
- superclasses => ['MooseX::Role::Parameterized::Meta::Role::Parameterized'],
- );
- my $role = $metaclass->construct_instance(
- parameters => $parameters,
- );
+ my $role = $self->parameterized_role_metaclass->create_anon_role(parameters => $parameters);
local $MooseX::Role::Parameterized::CURRENT_METACLASS = $role;
$self->role_generator->($parameters,
return $role;
}
+sub apply {
+ my $self = shift;
+ my $class = shift;
+ my %args = @_;
+
+ my $role = $self->generate_role(%args);
+ $role->apply($class, %args);
+}
+
__PACKAGE__->meta->make_immutable;
no Moose;