Checking in changes prior to tagging of version 0.84.
[gitmo/Mouse.git] / lib / Mouse / Role.pm
CommitLineData
f9e68395 1package Mouse::Role;
8bdd9cfc 2use Mouse::Exporter; # enables strict and warnings
f3bb863f 3
59afef98 4our $VERSION = '0.84';
8bdd9cfc 5
6use Carp qw(confess);
43523060 7use Scalar::Util qw(blessed);
f9e68395 8
6d28c5cf 9use Mouse ();
fea36fd2 10
11Mouse::Exporter->setup_import_methods(
12 as_is => [qw(
13 extends with
14 has
15 before after around
16 override super
17 augment inner
18
19 requires excludes
20 ),
21 \&Scalar::Util::blessed,
22 \&Carp::confess,
23 ],
2cb8b713 24);
25
43523060 26
9ee0e57c 27sub extends {
28 Carp::croak "Roles do not support 'extends'";
29}
43523060 30
4cc4f8ed 31sub with {
32 Mouse::Util::apply_all_roles(scalar(caller), @_);
9ee0e57c 33 return;
34}
35
36sub has {
37 my $meta = Mouse::Meta::Role->initialize(scalar caller);
38 my $name = shift;
39
40 $meta->throw_error(q{Usage: has 'name' => ( key => value, ... )})
41 if @_ % 2; # odd number of arguments
42
13f78bbc 43 for my $n(ref($name) ? @{$name} : $name){
44 $meta->add_attribute($n => @_);
9ee0e57c 45 }
46 return;
47}
b32e8fb9 48
49sub before {
8bc2760b 50 my $meta = Mouse::Meta::Role->initialize(scalar caller);
b32e8fb9 51 my $code = pop;
013ee5f0 52 for my $name($meta->_collect_methods(@_)) {
53 $meta->add_before_method_modifier($name => $code);
b32e8fb9 54 }
9ee0e57c 55 return;
b32e8fb9 56}
57
58sub after {
8bc2760b 59 my $meta = Mouse::Meta::Role->initialize(scalar caller);
b32e8fb9 60 my $code = pop;
013ee5f0 61 for my $name($meta->_collect_methods(@_)) {
62 $meta->add_after_method_modifier($name => $code);
f9e68395 63 }
9ee0e57c 64 return;
b32e8fb9 65}
66
67sub around {
8bc2760b 68 my $meta = Mouse::Meta::Role->initialize(scalar caller);
b32e8fb9 69 my $code = pop;
013ee5f0 70 for my $name($meta->_collect_methods(@_)) {
71 $meta->add_around_method_modifier($name => $code);
b32e8fb9 72 }
9ee0e57c 73 return;
b32e8fb9 74}
75
67199842 76
77sub super {
85bd3f44 78 return if !defined $Mouse::SUPER_BODY;
67199842 79 $Mouse::SUPER_BODY->(@Mouse::SUPER_ARGS);
80}
81
82sub override {
85bd3f44 83 # my($name, $code) = @_;
84 Mouse::Meta::Role->initialize(scalar caller)->add_override_method_modifier(@_);
9ee0e57c 85 return;
67199842 86}
87
88# We keep the same errors messages as Moose::Role emits, here.
89sub inner {
6d28c5cf 90 Carp::croak "Roles cannot support 'inner'";
67199842 91}
92
93sub augment {
6d28c5cf 94 Carp::croak "Roles cannot support 'augment'";
67199842 95}
96
59089ec3 97sub requires {
8bc2760b 98 my $meta = Mouse::Meta::Role->initialize(scalar caller);
6d28c5cf 99 $meta->throw_error("Must specify at least one method") unless @_;
59089ec3 100 $meta->add_required_methods(@_);
9ee0e57c 101 return;
59089ec3 102}
b32e8fb9 103
6d28c5cf 104sub excludes {
1d76ae62 105 Mouse::Util::not_supported();
6d28c5cf 106}
b32e8fb9 107
fea36fd2 108sub init_meta{
9704fe9d 109 shift;
110 my %args = @_;
7daedfff 111
9704fe9d 112 my $class = $args{for_class}
fea36fd2 113 or Carp::confess("Cannot call init_meta without specifying a for_class");
b32e8fb9 114
fea36fd2 115 my $metaclass = $args{metaclass} || 'Mouse::Meta::Role';
7daedfff 116
9704fe9d 117 my $meta = $metaclass->initialize($class);
7daedfff 118
fea36fd2 119 $meta->add_method(meta => sub{
120 $metaclass->initialize(ref($_[0]) || $_[0]);
3a63a2e7 121 });
b32e8fb9 122
9704fe9d 123 # make a role type for each Mouse role
124 Mouse::Util::TypeConstraints::role_type($class)
125 unless Mouse::Util::TypeConstraints::find_type_constraint($class);
126
fea36fd2 127 return $meta;
b32e8fb9 128}
f9e68395 129
1301;
131
cadd5b5e 132__END__
133
134=head1 NAME
135
1820fffe 136Mouse::Role - The Mouse Role
137
a25ca8d6 138=head1 VERSION
139
59afef98 140This document describes Mouse version 0.84
a25ca8d6 141
1820fffe 142=head1 SYNOPSIS
143
f5366662 144 package Comparable;
145 use Mouse::Role; # the package is now a Mouse role
146
147 # Declare methods that are required by this role
148 requires qw(compare);
149
150 # Define methods this role provides
151 sub equals {
152 my($self, $other) = @_;
153 return $self->compare($other) == 0;
154 }
155
156 # and later
157 package MyObject;
158 use Mouse;
159 with qw(Comparable); # Now MyObject can equals()
160
161 sub compare {
162 # ...
163 }
164
165 my $foo = MyObject->new();
166 my $bar = MyObject->new();
167 $obj->equals($bar); # yes, it is comparable
cadd5b5e 168
169=head1 KEYWORDS
170
1820fffe 171=head2 C<< meta -> Mouse::Meta::Role >>
cadd5b5e 172
173Returns this role's metaclass instance.
174
b0b9f25a 175=head2 C<< before (method|methods|regexp) -> CodeRef >>
cadd5b5e 176
8b13ad67 177Sets up a B<before> method modifier. See L<Moose/before>.
cadd5b5e 178
b0b9f25a 179=head2 C<< after (method|methods|regexp) => CodeRef >>
cadd5b5e 180
8b13ad67 181Sets up an B<after> method modifier. See L<Moose/after>.
cadd5b5e 182
b0b9f25a 183=head2 C<< around (method|methods|regexp) => CodeRef >>
cadd5b5e 184
8b13ad67 185Sets up an B<around> method modifier. See L<Moose/around>.
cadd5b5e 186
1820fffe 187=head2 C<super>
67199842 188
1820fffe 189Sets up the B<super> keyword. See L<Moose/super>.
67199842 190
1820fffe 191=head2 C<< override method => CodeRef >>
67199842 192
1820fffe 193Sets up an B<override> method modifier. See L<Moose/Role/override>.
67199842 194
1820fffe 195=head2 C<inner>
67199842 196
1820fffe 197This is not supported in roles and emits an error. See L<Moose/Role>.
67199842 198
1820fffe 199=head2 C<< augment method => CodeRef >>
67199842 200
1820fffe 201This is not supported in roles and emits an error. See L<Moose/Role>.
67199842 202
1820fffe 203=head2 C<< has (name|names) => parameters >>
cadd5b5e 204
205Sets up an attribute (or if passed an arrayref of names, multiple attributes) to
206this role. See L<Mouse/has>.
207
1820fffe 208=head2 C<< confess(error) -> BOOM >>
cadd5b5e 209
210L<Carp/confess> for your convenience.
211
1820fffe 212=head2 C<< blessed(value) -> ClassName | undef >>
cadd5b5e 213
214L<Scalar::Util/blessed> for your convenience.
215
216=head1 MISC
217
218=head2 import
219
220Importing Mouse::Role will give you sugar.
221
222=head2 unimport
223
1820fffe 224Please unimport (C<< no Mouse::Role >>) so that if someone calls one of the
cadd5b5e 225keywords (such as L</has>) it will break loudly instead breaking subtly.
226
1820fffe 227=head1 SEE ALSO
228
229L<Moose::Role>
230
cadd5b5e 231=cut
232