2 package MooseX::Role::Parameterized;
3 use Moose qw/extends around confess/;
5 extends 'Moose::Exporter';
7 use MooseX::Role::Parameterized::Meta::Role::Parameterizable;
9 our $CURRENT_METACLASS;
11 __PACKAGE__->setup_import_methods(
12 with_caller => ['parameter', 'role', 'method'],
20 $names = [$names] if !ref($names);
22 for my $name (@$names) {
23 $caller->meta->add_parameter($name, @_);
29 my $role_generator = shift;
30 $caller->meta->role_generator($role_generator);
36 return Moose::Role->init_meta(@_,
37 metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterizable',
41 # give role a (&) prototype
42 around _make_wrapper => sub {
44 my ($self, $caller, $sub, $fq_name) = @_;
46 if ($fq_name =~ /::role$/) {
47 return sub (&) { $sub->($caller, @_) };
54 confess "has must be called within the role { ... } block."
55 unless $CURRENT_METACLASS;
58 $names = [$names] if !ref($names);
60 for my $name (@$names) {
61 $CURRENT_METACLASS->add_attribute($name, @_);
66 confess "method must be called within the role { ... } block."
67 unless $CURRENT_METACLASS;
73 my $method = Moose::Meta::Method->wrap(
74 package_name => $caller,
79 $CURRENT_METACLASS->add_method($name => $method);