8 use Scalar::Util 'blessed';
10 use Mouse::Util qw(load_class get_code_package not_supported);
13 our @ISA = qw(Exporter);
27 our %is_removable = map{ $_ => undef } @EXPORT;
28 delete $is_removable{confess};
29 delete $is_removable{blessed};
32 my $meta = Mouse::Meta::Role->initialize(scalar caller);
36 $meta->add_before_method_modifier($_ => $code);
41 my $meta = Mouse::Meta::Role->initialize(scalar caller);
45 $meta->add_after_method_modifier($_ => $code);
50 my $meta = Mouse::Meta::Role->initialize(scalar caller);
54 $meta->add_around_method_modifier($_ => $code);
60 return if !defined $Mouse::SUPER_BODY;
61 $Mouse::SUPER_BODY->(@Mouse::SUPER_ARGS);
65 # my($name, $code) = @_;
66 Mouse::Meta::Role->initialize(scalar caller)->add_override_method_modifier(@_);
69 # We keep the same errors messages as Moose::Role emits, here.
71 Carp::croak "Roles cannot support 'inner'";
75 Carp::croak "Roles cannot support 'augment'";
79 my $meta = Mouse::Meta::Role->initialize(scalar caller);
82 $meta->add_attribute($_ => @_) for ref($name) ? @{$name} : $name;
86 Carp::croak "Roles do not support 'extends'"
90 my $meta = Mouse::Meta::Role->initialize(scalar caller);
91 Mouse::Util::apply_all_roles($meta->name, @_);
95 my $meta = Mouse::Meta::Role->initialize(scalar caller);
96 $meta->throw_error("Must specify at least one method") unless @_;
97 $meta->add_required_methods(@_);
112 # we should never export to main
113 if ($caller eq 'main') {
114 warn qq{$class does not export its sugar to the 'main' package.\n};
118 Mouse::Meta::Role->initialize($caller)->add_method(meta => sub {
119 return Mouse::Meta::Role->initialize(ref($_[0]) || $_[0]);
122 Mouse::Role->export_to_level(1, @_);
133 for my $keyword (@EXPORT) {
135 if(exists $is_removable{$keyword}
136 && ($code = $caller->can($keyword))
137 && get_code_package($code) eq __PACKAGE__){
139 delete $stash->{$keyword};
151 Mouse::Role - The Mouse Role
160 =head2 C<< meta -> Mouse::Meta::Role >>
162 Returns this role's metaclass instance.
164 =head2 C<< before (method|methods) -> CodeRef >>
166 Sets up a B<before> method modifier. See L<Moose/before> or
167 L<Class::Method::Modifiers/before>.
169 =head2 C<< after (method|methods) => CodeRef >>
171 Sets up an B<after> method modifier. See L<Moose/after> or
172 L<Class::Method::Modifiers/after>.
174 =head2 C<< around (method|methods) => CodeRef >>
176 Sets up an B<around> method modifier. See L<Moose/around> or
177 L<Class::Method::Modifiers/around>.
181 Sets up the B<super> keyword. See L<Moose/super>.
183 =head2 C<< override method => CodeRef >>
185 Sets up an B<override> method modifier. See L<Moose/Role/override>.
189 This is not supported in roles and emits an error. See L<Moose/Role>.
191 =head2 C<< augment method => CodeRef >>
193 This is not supported in roles and emits an error. See L<Moose/Role>.
195 =head2 C<< has (name|names) => parameters >>
197 Sets up an attribute (or if passed an arrayref of names, multiple attributes) to
198 this role. See L<Mouse/has>.
200 =head2 C<< confess(error) -> BOOM >>
202 L<Carp/confess> for your convenience.
204 =head2 C<< blessed(value) -> ClassName | undef >>
206 L<Scalar::Util/blessed> for your convenience.
212 Importing Mouse::Role will give you sugar.
216 Please unimport (C<< no Mouse::Role >>) so that if someone calls one of the
217 keywords (such as L</has>) it will break loudly instead breaking subtly.