Remove an useless "use Scalar::Util" directive
[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
6e168432 6our $VERSION = '0.40_05';
c3398f5b 7
8bdd9cfc 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;
43165725 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");
c9a3c0ed 133
0d6e12be 134 my $base_class = $args{base_class} || 'Mouse::Object';
135 my $metaclass = $args{metaclass} || 'Mouse::Meta::Class';
136
0d6e12be 137 my $meta = $metaclass->initialize($class);
0d6e12be 138
3a63a2e7 139 $meta->add_method(meta => sub{
382b7340 140 return $metaclass->initialize(ref($_[0]) || $_[0]);
3a63a2e7 141 });
142
382b7340 143 $meta->superclasses($base_class)
144 unless $meta->superclasses;
0d6e12be 145
c9a3c0ed 146 # make a class type for each Mouse class
147 Mouse::Util::TypeConstraints::class_type($class)
148 unless Mouse::Util::TypeConstraints::find_type_constraint($class);
149
0d6e12be 150 return $meta;
151}
152
c3398f5b 153
c3398f5b 1541;
c3398f5b 155__END__
156
157=head1 NAME
158
0fff36e6 159Mouse - Moose minus the antlers
c3398f5b 160
2efecf0c 161=head1 VERSION
162
6e168432 163This document describes Mouse version 0.40_05
2efecf0c 164
c3398f5b 165=head1 SYNOPSIS
166
167 package Point;
6caea456 168 use Mouse; # automatically turns on strict and warnings
169
170 has 'x' => (is => 'rw', isa => 'Int');
171 has 'y' => (is => 'rw', isa => 'Int');
172
173 sub clear {
174 my $self = shift;
175 $self->x(0);
176 $self->y(0);
177 }
178
179 package Point3D;
c3398f5b 180 use Mouse;
181
6caea456 182 extends 'Point';
c3398f5b 183
6caea456 184 has 'z' => (is => 'rw', isa => 'Int');
185
8517d2ff 186 after 'clear' => sub {
187 my $self = shift;
188 $self->z(0);
189 };
c3398f5b 190
191=head1 DESCRIPTION
192
6614c108 193L<Moose> is wonderful. B<Use Moose instead of Mouse.>
c3398f5b 194
16913e71 195Unfortunately, Moose has a compile-time penalty. Though significant progress
196has been made over the years, the compile time penalty is a non-starter for
197some very specific applications. If you are writing a command-line application
198or CGI script where startup time is essential, you may not be able to use
199Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
200latter, if possible.
0fff36e6 201
6614c108 202Mouse aims to alleviate this by providing a subset of Moose's functionality,
203faster.
0fff36e6 204
4f74e488 205We're also going as light on dependencies as possible. Mouse currently has
206B<no dependencies> except for testing modules.
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
4f74e488 226See also L<Mouse::Spec> for compatibility and incompatibility with Moose.
227
9090e5fe 228=head2 MouseX
229
230Please don't copy MooseX code to MouseX. If you need extensions, you really
231should upgrade to Moose. We don't need two parallel sets of extensions!
232
233If you really must write a Mouse extension, please contact the Moose mailing
234list or #moose on IRC beforehand.
235
0fff36e6 236=head1 KEYWORDS
c3398f5b 237
1820fffe 238=head2 C<< $object->meta -> Mouse::Meta::Class >>
c3398f5b 239
240Returns this class' metaclass instance.
241
1820fffe 242=head2 C<< extends superclasses >>
c3398f5b 243
244Sets this class' superclasses.
245
1820fffe 246=head2 C<< before (method|methods) => CodeRef >>
b7a74822 247
248Installs a "before" method modifier. See L<Moose/before> or
249L<Class::Method::Modifiers/before>.
250
6beb7db6 251Use of this feature requires L<Class::Method::Modifiers>!
252
1820fffe 253=head2 C<< after (method|methods) => CodeRef >>
b7a74822 254
255Installs an "after" method modifier. See L<Moose/after> or
256L<Class::Method::Modifiers/after>.
257
6beb7db6 258Use of this feature requires L<Class::Method::Modifiers>!
259
1820fffe 260=head2 C<< around (method|methods) => CodeRef >>
b7a74822 261
262Installs an "around" method modifier. See L<Moose/around> or
263L<Class::Method::Modifiers/around>.
264
6beb7db6 265Use of this feature requires L<Class::Method::Modifiers>!
266
1820fffe 267=head2 C<< has (name|names) => parameters >>
c3398f5b 268
269Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 270this class. Options:
271
272=over 4
273
1820fffe 274=item C<< is => ro|rw|bare >>
0fff36e6 275
276If specified, inlines a read-only/read-write accessor with the same name as
277the attribute.
278
1820fffe 279=item C<< isa => TypeConstraint >>
0fff36e6 280
5893ee36 281Provides type checking in the constructor and accessor. The following types are
1820fffe 282supported. Any unknown type is taken to be a class check
283(e.g. C<< isa => 'DateTime' >> would accept only L<DateTime> objects).
5893ee36 284
285 Any Item Bool Undef Defined Value Num Int Str ClassName
286 Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
287 FileHandle Object
288
289For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
290
0fff36e6 291
1820fffe 292=item C<< required => Bool >>
0fff36e6 293
294Whether this attribute is required to have a value. If the attribute is lazy or
295has a builder, then providing a value for the attribute in the constructor is
296optional.
297
1820fffe 298=item C<< init_arg => Str | Undef >>
0fff36e6 299
ca63d17a 300Allows you to use a different key name in the constructor. If undef, the
1820fffe 301attribute can't be passed to the constructor.
0fff36e6 302
1820fffe 303=item C<< default => Value | CodeRef >>
0fff36e6 304
305Sets the default value of the attribute. If the default is a coderef, it will
306be invoked to get the default value. Due to quirks of Perl, any bare reference
307is forbidden, you must wrap the reference in a coderef. Otherwise, all
308instances will share the same reference.
309
1820fffe 310=item C<< lazy => Bool >>
0fff36e6 311
312If specified, the default is calculated on demand instead of in the
313constructor.
314
1820fffe 315=item C<< predicate => Str >>
0fff36e6 316
317Lets you specify a method name for installing a predicate method, which checks
318that the attribute has a value. It will not invoke a lazy default or builder
319method.
320
1820fffe 321=item C<< clearer => Str >>
0fff36e6 322
323Lets you specify a method name for installing a clearer method, which clears
324the attribute's value from the instance. On the next read, lazy or builder will
325be invoked.
326
1820fffe 327=item C<< handles => HashRef|ArrayRef >>
0fff36e6 328
329Lets you specify methods to delegate to the attribute. ArrayRef forwards the
330given method names to method calls on the attribute. HashRef maps local method
331names to remote method names called on the attribute. Other forms of
332L</handles>, such as regular expression and coderef, are not yet supported.
333
1820fffe 334=item C<< weak_ref => Bool >>
0fff36e6 335
336Lets you automatically weaken any reference stored in the attribute.
337
6beb7db6 338Use of this feature requires L<Scalar::Util>!
339
1820fffe 340=item C<< trigger => CodeRef >>
844fa049 341
342Any 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.
343
1820fffe 344=item C<< builder => Str >>
0fff36e6 345
346Defines a method name to be called to provide the default value of the
347attribute. C<< builder => 'build_foo' >> is mostly equivalent to
348C<< default => sub { $_[0]->build_foo } >>.
349
1820fffe 350=item C<< auto_deref => Bool >>
0fff36e6 351
352Allows you to automatically dereference ArrayRef and HashRef attributes in list
353context. In scalar context, the reference is returned (NOT the list length or
354bucket status). You must specify an appropriate type constraint to use
355auto_deref.
356
1820fffe 357=item C<< lazy_build => Bool >>
358
359Automatically define the following options:
5253d13d 360
1820fffe 361 has $attr => (
362 # ...
363 lazy => 1
364 builder => "_build_$attr",
365 clearer => "clear_$attr",
366 predicate => "has_$attr",
367 );
5253d13d 368
0fff36e6 369=back
c3398f5b 370
1820fffe 371=head2 C<< confess(message) -> BOOM >>
c3398f5b 372
373L<Carp/confess> for your convenience.
374
1820fffe 375=head2 C<< blessed(value) -> ClassName | undef >>
c3398f5b 376
377L<Scalar::Util/blessed> for your convenience.
378
379=head1 MISC
380
381=head2 import
382
6caea456 383Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 384You may use L</extends> to replace the superclass list.
385
386=head2 unimport
387
0fff36e6 388Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
389keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 390
1820fffe 391=head1 SOURCE CODE ACCESS
c3398f5b 392
1820fffe 393We have a public git repository:
c3398f5b 394
1820fffe 395 git clone git://jules.scsys.co.uk/gitmo/Mouse.git
c3398f5b 396
1820fffe 397=head1 DEPENDENCIES
262801ef 398
1820fffe 399Perl 5.6.2 or later.
262801ef 400
1820fffe 401=head1 SEE ALSO
e693975f 402
4f74e488 403L<Mouse::Spec>
404
1820fffe 405L<Moose>
e693975f 406
1820fffe 407L<Class::MOP>
e693975f 408
c817e8f1 409=head1 AUTHORS
c3398f5b 410
434ca269 411Shawn M Moore, E<lt>sartak at gmail.comE<gt>
c3398f5b 412
434ca269 413Yuval Kogman, E<lt>nothingmuch at woobling.orgE<gt>
fc9f8988 414
c817e8f1 415tokuhirom
416
417Yappo
418
ea6dc3a5 419wu-lee
420
434ca269 421Goro Fuji (gfx) E<lt>gfuji at cpan.orgE<gt>
ba55dea1 422
0fff36e6 423with plenty of code borrowed from L<Class::MOP> and L<Moose>
424
c3398f5b 425=head1 BUGS
426
1820fffe 427All complex software has bugs lurking in it, and this module is no exception.
428Please report any bugs to C<bug-mouse at rt.cpan.org>, or through the web
429interface at L<http://rt.cpan.org/Public/Dist/Display.html?Name=Mouse>
c3398f5b 430
431=head1 COPYRIGHT AND LICENSE
432
3ef6ae56 433Copyright 2008-2009 Infinity Interactive, Inc.
434
435http://www.iinteractive.com/
c3398f5b 436
437This program is free software; you can redistribute it and/or modify it
438under the same terms as Perl itself.
439
440=cut
441