2 package MooseX::Role::Parameterized;
4 extends => { -as => 'moose_extends' },
10 moose_extends 'Moose::Exporter';
12 use MooseX::Role::Parameterized::Meta::Role::Parameterizable;
14 our $CURRENT_METACLASS;
16 __PACKAGE__->setup_import_methods(
17 with_caller => ['parameter', 'role', 'method'],
18 as_is => ['has', 'with', 'extends', 'requires', 'augment', 'inner'],
25 $names = [$names] if !ref($names);
27 for my $name (@$names) {
28 Class::MOP::Class->initialize($caller)->add_parameter($name, @_);
34 my $role_generator = shift;
35 Class::MOP::Class->initialize($caller)->role_generator($role_generator);
41 return Moose::Role->init_meta(@_,
42 metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterizable',
46 # give role a (&) prototype
47 around _make_wrapper => sub {
49 my ($self, $caller, $sub, $fq_name) = @_;
51 if ($fq_name =~ /::role$/) {
52 return sub (&) { $sub->($caller, @_) };
59 confess "has must be called within the role { ... } block."
60 unless $CURRENT_METACLASS;
63 $names = [$names] if !ref($names);
65 for my $name (@$names) {
66 $CURRENT_METACLASS->add_attribute($name, @_);
71 confess "method must be called within the role { ... } block."
72 unless $CURRENT_METACLASS;
78 my $method = $CURRENT_METACLASS->method_metaclass->wrap(
79 package_name => $caller,
84 $CURRENT_METACLASS->add_method($name => $method);
88 confess "with must be called within the role { ... } block."
89 unless $CURRENT_METACLASS;
90 Moose::Util::apply_all_roles($CURRENT_METACLASS, @_);
94 confess "requires must be called within the role { ... } block."
95 unless $CURRENT_METACLASS;
96 croak "Must specify at least one method" unless @_;
97 $CURRENT_METACLASS->add_required_methods(@_);
100 sub extends { croak "Roles do not currently support 'extends'" }
102 sub inner { croak "Roles cannot support 'inner'" }
104 sub augment { croak "Roles cannot support 'augment'" }