8 use Scalar::Util 'blessed';
10 use Mouse::Util qw(load_class 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 unless $Mouse::SUPER_BODY;
61 $Mouse::SUPER_BODY->(@Mouse::SUPER_ARGS);
65 my $classname = caller;
66 my $meta = Mouse::Meta::Role->initialize($classname);
70 my $fullname = "${classname}::${name}";
73 && $meta->throw_error("Cannot add an override of method '$fullname' "
74 . "because there is a local version of '$fullname'");
76 $meta->add_override_method_modifier($name => sub {
77 local $Mouse::SUPER_PACKAGE = shift;
78 local $Mouse::SUPER_BODY = shift;
79 local @Mouse::SUPER_ARGS = @_;
85 # We keep the same errors messages as Moose::Role emits, here.
87 Carp::croak "Roles cannot support 'inner'";
91 Carp::croak "Roles cannot support 'augment'";
95 my $meta = Mouse::Meta::Role->initialize(scalar caller);
98 $meta->add_attribute($_ => @_) for ref($name) ? @{$name} : $name;
102 Carp::croak "Roles do not support 'extends'"
106 my $meta = Mouse::Meta::Role->initialize(scalar caller);
107 Mouse::Util::apply_all_roles($meta->name, @_);
111 my $meta = Mouse::Meta::Role->initialize(scalar caller);
112 $meta->throw_error("Must specify at least one method") unless @_;
113 $meta->add_required_methods(@_);
128 # we should never export to main
129 if ($caller eq 'main') {
130 warn qq{$class does not export its sugar to the 'main' package.\n};
134 Mouse::Meta::Role->initialize($caller)->add_method(meta => sub {
135 return Mouse::Meta::Role->initialize(ref($_[0]) || $_[0]);
138 Mouse::Role->export_to_level(1, @_);
149 for my $keyword (@EXPORT) {
151 if(exists $is_removable{$keyword}
152 && ($code = $caller->can($keyword))
153 && (Mouse::Util::get_code_info($code))[0] eq __PACKAGE__){
155 delete $stash->{$keyword};
167 Mouse::Role - The Mouse Role
176 =head2 C<< meta -> Mouse::Meta::Role >>
178 Returns this role's metaclass instance.
180 =head2 C<< before (method|methods) -> CodeRef >>
182 Sets up a B<before> method modifier. See L<Moose/before> or
183 L<Class::Method::Modifiers/before>.
185 =head2 C<< after (method|methods) => CodeRef >>
187 Sets up an B<after> method modifier. See L<Moose/after> or
188 L<Class::Method::Modifiers/after>.
190 =head2 C<< around (method|methods) => CodeRef >>
192 Sets up an B<around> method modifier. See L<Moose/around> or
193 L<Class::Method::Modifiers/around>.
197 Sets up the B<super> keyword. See L<Moose/super>.
199 =head2 C<< override method => CodeRef >>
201 Sets up an B<override> method modifier. See L<Moose/Role/override>.
205 This is not supported in roles and emits an error. See L<Moose/Role>.
207 =head2 C<< augment method => CodeRef >>
209 This is not supported in roles and emits an error. See L<Moose/Role>.
211 =head2 C<< has (name|names) => parameters >>
213 Sets up an attribute (or if passed an arrayref of names, multiple attributes) to
214 this role. See L<Mouse/has>.
216 =head2 C<< confess(error) -> BOOM >>
218 L<Carp/confess> for your convenience.
220 =head2 C<< blessed(value) -> ClassName | undef >>
222 L<Scalar::Util/blessed> for your convenience.
228 Importing Mouse::Role will give you sugar.
232 Please unimport (C<< no Mouse::Role >>) so that if someone calls one of the
233 keywords (such as L</has>) it will break loudly instead breaking subtly.