Creates role_type in Mouse::Role::init_meta
[gitmo/Mouse.git] / lib / Mouse.pm
CommitLineData
c3398f5b 1package Mouse;
eb88905f 2use 5.006_002;
3
bc69ee88 4use Mouse::Exporter; # enables strict and warnings
eb88905f 5
6f16d3ce 6our $VERSION = '0.37_05';
c3398f5b 7
fea36fd2 8use Carp qw(confess);
43523060 9use Scalar::Util qw(blessed);
6d28c5cf 10
01afd8ff 11use Mouse::Util qw(load_class is_class_loaded get_code_package not_supported);
c3398f5b 12
08f7a8db 13use Mouse::Meta::Module;
306290e8 14use Mouse::Meta::Class;
7a50b450 15use Mouse::Meta::Role;
6d28c5cf 16use Mouse::Meta::Attribute;
c3398f5b 17use Mouse::Object;
6d28c5cf 18use Mouse::Util::TypeConstraints ();
fea36fd2 19
20Mouse::Exporter->setup_import_methods(
21 as_is => [qw(
22 extends with
23 has
24 before after around
25 override super
26 augment inner
27 ),
28 \&Scalar::Util::blessed,
29 \&Carp::confess,
30 ],
2cb8b713 31);
eaad7dab 32
43523060 33# XXX: for backward compatibility
34our @EXPORT = qw(
35 extends with
36 has
37 before after around
38 override super
39 augment inner
40 blessed confess
41);
42
8bc2760b 43sub extends { Mouse::Meta::Class->initialize(scalar caller)->superclasses(@_) }
c3398f5b 44
eaad7dab 45sub has {
8bc2760b 46 my $meta = Mouse::Meta::Class->initialize(scalar caller);
1b9e472d 47 my $name = shift;
48
95ecd6f1 49 $meta->throw_error(q{Usage: has 'name' => ( key => value, ... )})\r
50 if @_ % 2; # odd number of arguments
51
1b9e472d 52 $meta->add_attribute($_ => @_) for ref($name) ? @{$name} : $name;
eaad7dab 53}
54
55sub before {
8bc2760b 56 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 57
58 my $code = pop;
59
60 for (@_) {
61 $meta->add_before_method_modifier($_ => $code);
62 }
63}
64
65sub after {
8bc2760b 66 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 67
68 my $code = pop;
69
70 for (@_) {
71 $meta->add_after_method_modifier($_ => $code);
72 }
73}
74
75sub around {
8bc2760b 76 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 77
78 my $code = pop;
79
80 for (@_) {
81 $meta->add_around_method_modifier($_ => $code);
82 }
83}
84
85sub with {
8bc2760b 86 Mouse::Util::apply_all_roles(scalar(caller), @_);
eaad7dab 87}
88
e6007308 89our $SUPER_PACKAGE;
90our $SUPER_BODY;
91our @SUPER_ARGS;
92
93sub super {
94 # This check avoids a recursion loop - see
95 # t/100_bugs/020_super_recursion.t
85bd3f44 96 return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller();
97 return if !defined $SUPER_BODY;
98 $SUPER_BODY->(@SUPER_ARGS);
e6007308 99}
100
101sub override {
85bd3f44 102 # my($name, $method) = @_;
103 Mouse::Meta::Class->initialize(scalar caller)->add_override_method_modifier(@_);
e6007308 104}
105
768804c0 106our %INNER_BODY;
107our %INNER_ARGS;
108
109sub inner {
110 my $pkg = caller();
111 if ( my $body = $INNER_BODY{$pkg} ) {
112 my $args = $INNER_ARGS{$pkg};
113 local $INNER_ARGS{$pkg};
114 local $INNER_BODY{$pkg};
115 return $body->(@{$args});
116 }
117 else {
118 return;
119 }
120}
121
122sub augment {
123 #my($name, $method) = @_;
124 Mouse::Meta::Class->initialize(scalar caller)->add_augment_method_modifier(@_);
125}
2cb8b713 126
0d6e12be 127sub init_meta {
0d6e12be 128 shift;
129 my %args = @_;
130
131 my $class = $args{for_class}
382b7340 132 or confess("Cannot call init_meta without specifying a for_class");
0d6e12be 133 my $base_class = $args{base_class} || 'Mouse::Object';
134 my $metaclass = $args{metaclass} || 'Mouse::Meta::Class';
135
0d6e12be 136 # make a subtype for each Mouse class
6d28c5cf 137 Mouse::Util::TypeConstraints::class_type($class)
138 unless Mouse::Util::TypeConstraints::find_type_constraint($class);
0d6e12be 139
140 my $meta = $metaclass->initialize($class);
0d6e12be 141
3a63a2e7 142 $meta->add_method(meta => sub{
382b7340 143 return $metaclass->initialize(ref($_[0]) || $_[0]);
3a63a2e7 144 });
145
382b7340 146 $meta->superclasses($base_class)
147 unless $meta->superclasses;
0d6e12be 148
149 return $meta;
150}
151
c3398f5b 152
c3398f5b 1531;
c3398f5b 154__END__
155
156=head1 NAME
157
0fff36e6 158Mouse - Moose minus the antlers
c3398f5b 159
2efecf0c 160=head1 VERSION
161
6f16d3ce 162This document describes Mouse version 0.37_05
2efecf0c 163
c3398f5b 164=head1 SYNOPSIS
165
166 package Point;
6caea456 167 use Mouse; # automatically turns on strict and warnings
168
169 has 'x' => (is => 'rw', isa => 'Int');
170 has 'y' => (is => 'rw', isa => 'Int');
171
172 sub clear {
173 my $self = shift;
174 $self->x(0);
175 $self->y(0);
176 }
177
178 package Point3D;
c3398f5b 179 use Mouse;
180
6caea456 181 extends 'Point';
c3398f5b 182
6caea456 183 has 'z' => (is => 'rw', isa => 'Int');
184
8517d2ff 185 after 'clear' => sub {
186 my $self = shift;
187 $self->z(0);
188 };
c3398f5b 189
190=head1 DESCRIPTION
191
6614c108 192L<Moose> is wonderful. B<Use Moose instead of Mouse.>
c3398f5b 193
16913e71 194Unfortunately, Moose has a compile-time penalty. Though significant progress
195has been made over the years, the compile time penalty is a non-starter for
196some very specific applications. If you are writing a command-line application
197or CGI script where startup time is essential, you may not be able to use
198Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
199latter, if possible.
0fff36e6 200
6614c108 201Mouse aims to alleviate this by providing a subset of Moose's functionality,
202faster.
0fff36e6 203
7ca75105 204We're also going as light on dependencies as possible.
3fcf8a33 205L<Class::Method::Modifiers::Fast> or L<Class::Method::Modifiers> is required
206if you want support for L</before>, L</after>, and L</around>.
d1c1b994 207
1820fffe 208=head2 MOOSE COMPATIBILITY
0fff36e6 209
210Compatibility with Moose has been the utmost concern. Fewer than 1% of the
211tests fail when run against Moose instead of Mouse. Mouse code coverage is also
7e3ed32e 212over 96%. Even the error messages are taken from Moose. The Mouse code just
213runs the test suite 4x faster.
0fff36e6 214
215The idea is that, if you need the extra power, you should be able to run
8e1a28a8 216C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
6614c108 217we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
16913e71 218in which case it will act as Moose. Since Mouse is a little sloppier than
219Moose, if you run into weird errors, it would be worth running:
220
221 ANY_MOOSE=Moose perl your-script.pl
222
223to see if the bug is caused by Mouse. Moose's diagnostics and validation are
224also much better.
0fff36e6 225
9090e5fe 226=head2 MouseX
227
228Please don't copy MooseX code to MouseX. If you need extensions, you really
229should upgrade to Moose. We don't need two parallel sets of extensions!
230
231If you really must write a Mouse extension, please contact the Moose mailing
232list or #moose on IRC beforehand.
233
0fff36e6 234=head1 KEYWORDS
c3398f5b 235
1820fffe 236=head2 C<< $object->meta -> Mouse::Meta::Class >>
c3398f5b 237
238Returns this class' metaclass instance.
239
1820fffe 240=head2 C<< extends superclasses >>
c3398f5b 241
242Sets this class' superclasses.
243
1820fffe 244=head2 C<< before (method|methods) => CodeRef >>
b7a74822 245
246Installs a "before" method modifier. See L<Moose/before> or
247L<Class::Method::Modifiers/before>.
248
6beb7db6 249Use of this feature requires L<Class::Method::Modifiers>!
250
1820fffe 251=head2 C<< after (method|methods) => CodeRef >>
b7a74822 252
253Installs an "after" method modifier. See L<Moose/after> or
254L<Class::Method::Modifiers/after>.
255
6beb7db6 256Use of this feature requires L<Class::Method::Modifiers>!
257
1820fffe 258=head2 C<< around (method|methods) => CodeRef >>
b7a74822 259
260Installs an "around" method modifier. See L<Moose/around> or
261L<Class::Method::Modifiers/around>.
262
6beb7db6 263Use of this feature requires L<Class::Method::Modifiers>!
264
1820fffe 265=head2 C<< has (name|names) => parameters >>
c3398f5b 266
267Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 268this class. Options:
269
270=over 4
271
1820fffe 272=item C<< is => ro|rw|bare >>
0fff36e6 273
274If specified, inlines a read-only/read-write accessor with the same name as
275the attribute.
276
1820fffe 277=item C<< isa => TypeConstraint >>
0fff36e6 278
5893ee36 279Provides type checking in the constructor and accessor. The following types are
1820fffe 280supported. Any unknown type is taken to be a class check
281(e.g. C<< isa => 'DateTime' >> would accept only L<DateTime> objects).
5893ee36 282
283 Any Item Bool Undef Defined Value Num Int Str ClassName
284 Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
285 FileHandle Object
286
287For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
288
0fff36e6 289
1820fffe 290=item C<< required => Bool >>
0fff36e6 291
292Whether this attribute is required to have a value. If the attribute is lazy or
293has a builder, then providing a value for the attribute in the constructor is
294optional.
295
1820fffe 296=item C<< init_arg => Str | Undef >>
0fff36e6 297
ca63d17a 298Allows you to use a different key name in the constructor. If undef, the
1820fffe 299attribute can't be passed to the constructor.
0fff36e6 300
1820fffe 301=item C<< default => Value | CodeRef >>
0fff36e6 302
303Sets the default value of the attribute. If the default is a coderef, it will
304be invoked to get the default value. Due to quirks of Perl, any bare reference
305is forbidden, you must wrap the reference in a coderef. Otherwise, all
306instances will share the same reference.
307
1820fffe 308=item C<< lazy => Bool >>
0fff36e6 309
310If specified, the default is calculated on demand instead of in the
311constructor.
312
1820fffe 313=item C<< predicate => Str >>
0fff36e6 314
315Lets you specify a method name for installing a predicate method, which checks
316that the attribute has a value. It will not invoke a lazy default or builder
317method.
318
1820fffe 319=item C<< clearer => Str >>
0fff36e6 320
321Lets you specify a method name for installing a clearer method, which clears
322the attribute's value from the instance. On the next read, lazy or builder will
323be invoked.
324
1820fffe 325=item C<< handles => HashRef|ArrayRef >>
0fff36e6 326
327Lets you specify methods to delegate to the attribute. ArrayRef forwards the
328given method names to method calls on the attribute. HashRef maps local method
329names to remote method names called on the attribute. Other forms of
330L</handles>, such as regular expression and coderef, are not yet supported.
331
1820fffe 332=item C<< weak_ref => Bool >>
0fff36e6 333
334Lets you automatically weaken any reference stored in the attribute.
335
6beb7db6 336Use of this feature requires L<Scalar::Util>!
337
1820fffe 338=item C<< trigger => CodeRef >>
844fa049 339
340Any time the attribute's value is set (either through the accessor or the constructor), the trigger is called on it. The trigger receives as arguments the instance, the new value, and the attribute instance.
341
1820fffe 342=item C<< builder => Str >>
0fff36e6 343
344Defines a method name to be called to provide the default value of the
345attribute. C<< builder => 'build_foo' >> is mostly equivalent to
346C<< default => sub { $_[0]->build_foo } >>.
347
1820fffe 348=item C<< auto_deref => Bool >>
0fff36e6 349
350Allows you to automatically dereference ArrayRef and HashRef attributes in list
351context. In scalar context, the reference is returned (NOT the list length or
352bucket status). You must specify an appropriate type constraint to use
353auto_deref.
354
1820fffe 355=item C<< lazy_build => Bool >>
356
357Automatically define the following options:
5253d13d 358
1820fffe 359 has $attr => (
360 # ...
361 lazy => 1
362 builder => "_build_$attr",
363 clearer => "clear_$attr",
364 predicate => "has_$attr",
365 );
5253d13d 366
0fff36e6 367=back
c3398f5b 368
1820fffe 369=head2 C<< confess(message) -> BOOM >>
c3398f5b 370
371L<Carp/confess> for your convenience.
372
1820fffe 373=head2 C<< blessed(value) -> ClassName | undef >>
c3398f5b 374
375L<Scalar::Util/blessed> for your convenience.
376
377=head1 MISC
378
379=head2 import
380
6caea456 381Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 382You may use L</extends> to replace the superclass list.
383
384=head2 unimport
385
0fff36e6 386Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
387keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 388
1820fffe 389=head1 SOURCE CODE ACCESS
c3398f5b 390
1820fffe 391We have a public git repository:
c3398f5b 392
1820fffe 393 git clone git://jules.scsys.co.uk/gitmo/Mouse.git
c3398f5b 394
1820fffe 395=head1 DEPENDENCIES
262801ef 396
1820fffe 397Perl 5.6.2 or later.
262801ef 398
1820fffe 399=head1 SEE ALSO
e693975f 400
1820fffe 401L<Moose>
e693975f 402
1820fffe 403L<Class::MOP>
e693975f 404
c817e8f1 405=head1 AUTHORS
c3398f5b 406
434ca269 407Shawn M Moore, E<lt>sartak at gmail.comE<gt>
c3398f5b 408
434ca269 409Yuval Kogman, E<lt>nothingmuch at woobling.orgE<gt>
fc9f8988 410
c817e8f1 411tokuhirom
412
413Yappo
414
ea6dc3a5 415wu-lee
416
434ca269 417Goro Fuji (gfx) E<lt>gfuji at cpan.orgE<gt>
ba55dea1 418
0fff36e6 419with plenty of code borrowed from L<Class::MOP> and L<Moose>
420
c3398f5b 421=head1 BUGS
422
1820fffe 423All complex software has bugs lurking in it, and this module is no exception.
424Please report any bugs to C<bug-mouse at rt.cpan.org>, or through the web
425interface at L<http://rt.cpan.org/Public/Dist/Display.html?Name=Mouse>
c3398f5b 426
427=head1 COPYRIGHT AND LICENSE
428
3ef6ae56 429Copyright 2008-2009 Infinity Interactive, Inc.
430
431http://www.iinteractive.com/
c3398f5b 432
433This program is free software; you can redistribute it and/or modify it
434under the same terms as Perl itself.
435
436=cut
437