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