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