Bump to 0.26
[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.26';
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 has
272 been made over the years, the compile time penalty is a non-starter for some
273 applications.
274
275 Mouse aims to alleviate this by providing a subset of Moose's functionality,
276 faster.
277
278 We're also going as light on dependencies as possible.
279 L<Class::Method::Modifiers> or L<Data::Util> is required if you want support
280 for L</before>, L</after>, and L</around>.
281
282 =head2 MOOSE COMPAT
283
284 Compatibility with Moose has been the utmost concern. Fewer than 1% of the
285 tests fail when run against Moose instead of Mouse. Mouse code coverage is also
286 over 96%. Even the error messages are taken from Moose. The Mouse code just
287 runs the test suite 4x faster.
288
289 The idea is that, if you need the extra power, you should be able to run
290 C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
291 we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
292 in which case it will act as Moose.
293
294 =head2 MouseX
295
296 Please don't copy MooseX code to MouseX. If you need extensions, you really
297 should upgrade to Moose. We don't need two parallel sets of extensions!
298
299 If you really must write a Mouse extension, please contact the Moose mailing
300 list or #moose on IRC beforehand.
301
302 =head1 KEYWORDS
303
304 =head2 meta -> Mouse::Meta::Class
305
306 Returns this class' metaclass instance.
307
308 =head2 extends superclasses
309
310 Sets this class' superclasses.
311
312 =head2 before (method|methods) => Code
313
314 Installs a "before" method modifier. See L<Moose/before> or
315 L<Class::Method::Modifiers/before>.
316
317 Use of this feature requires L<Class::Method::Modifiers>!
318
319 =head2 after (method|methods) => Code
320
321 Installs an "after" method modifier. See L<Moose/after> or
322 L<Class::Method::Modifiers/after>.
323
324 Use of this feature requires L<Class::Method::Modifiers>!
325
326 =head2 around (method|methods) => Code
327
328 Installs an "around" method modifier. See L<Moose/around> or
329 L<Class::Method::Modifiers/around>.
330
331 Use of this feature requires L<Class::Method::Modifiers>!
332
333 =head2 has (name|names) => parameters
334
335 Adds an attribute (or if passed an arrayref of names, multiple attributes) to
336 this class. Options:
337
338 =over 4
339
340 =item is => ro|rw
341
342 If specified, inlines a read-only/read-write accessor with the same name as
343 the attribute.
344
345 =item isa => TypeConstraint
346
347 Provides type checking in the constructor and accessor. The following types are
348 supported. Any unknown type is taken to be a class check (e.g. isa =>
349 'DateTime' would accept only L<DateTime> objects).
350
351     Any Item Bool Undef Defined Value Num Int Str ClassName
352     Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
353     FileHandle Object
354
355 For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
356
357
358 =item required => 0|1
359
360 Whether this attribute is required to have a value. If the attribute is lazy or
361 has a builder, then providing a value for the attribute in the constructor is
362 optional.
363
364 =item init_arg => Str | Undef
365
366 Allows you to use a different key name in the constructor.  If undef, the
367 attribue can't be passed to the constructor.
368
369 =item default => Value | CodeRef
370
371 Sets the default value of the attribute. If the default is a coderef, it will
372 be invoked to get the default value. Due to quirks of Perl, any bare reference
373 is forbidden, you must wrap the reference in a coderef. Otherwise, all
374 instances will share the same reference.
375
376 =item lazy => 0|1
377
378 If specified, the default is calculated on demand instead of in the
379 constructor.
380
381 =item predicate => Str
382
383 Lets you specify a method name for installing a predicate method, which checks
384 that the attribute has a value. It will not invoke a lazy default or builder
385 method.
386
387 =item clearer => Str
388
389 Lets you specify a method name for installing a clearer method, which clears
390 the attribute's value from the instance. On the next read, lazy or builder will
391 be invoked.
392
393 =item handles => HashRef|ArrayRef
394
395 Lets you specify methods to delegate to the attribute. ArrayRef forwards the
396 given method names to method calls on the attribute. HashRef maps local method
397 names to remote method names called on the attribute. Other forms of
398 L</handles>, such as regular expression and coderef, are not yet supported.
399
400 =item weak_ref => 0|1
401
402 Lets you automatically weaken any reference stored in the attribute.
403
404 Use of this feature requires L<Scalar::Util>!
405
406 =item trigger => CodeRef
407
408 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.
409
410 Mouse 0.05 supported more complex triggers, but this behavior is now removed.
411
412 =item builder => Str
413
414 Defines a method name to be called to provide the default value of the
415 attribute. C<< builder => 'build_foo' >> is mostly equivalent to
416 C<< default => sub { $_[0]->build_foo } >>.
417
418 =item auto_deref => 0|1
419
420 Allows you to automatically dereference ArrayRef and HashRef attributes in list
421 context. In scalar context, the reference is returned (NOT the list length or
422 bucket status). You must specify an appropriate type constraint to use
423 auto_deref.
424
425 =item lazy_build => 0|1
426
427 Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
428 "clear_$attr', predicate => 'has_$attr' unless they are already defined.
429
430 =back
431
432 =head2 confess error -> BOOM
433
434 L<Carp/confess> for your convenience.
435
436 =head2 blessed value -> ClassName | undef
437
438 L<Scalar::Util/blessed> for your convenience.
439
440 =head1 MISC
441
442 =head2 import
443
444 Importing Mouse will default your class' superclass list to L<Mouse::Object>.
445 You may use L</extends> to replace the superclass list.
446
447 =head2 unimport
448
449 Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
450 keywords (such as L</extends>) it will break loudly instead breaking subtly.
451
452 =head1 FUNCTIONS
453
454 =head2 load_class Class::Name
455
456 This will load a given C<Class::Name> (or die if it's not loadable).
457 This function can be used in place of tricks like
458 C<eval "use $module"> or using C<require>.
459
460 =head2 is_class_loaded Class::Name -> Bool
461
462 Returns whether this class is actually loaded or not. It uses a heuristic which
463 involves checking for the existence of C<$VERSION>, C<@ISA>, and any
464 locally-defined method.
465
466 =head1 SOURCE CODE ACCESS
467
468 We have a public git repo:
469
470  git clone git://jules.scsys.co.uk/gitmo/Mouse.git
471
472 =head1 AUTHORS
473
474 Shawn M Moore, C<< <sartak at gmail.com> >>
475
476 Yuval Kogman, C<< <nothingmuch at woobling.org> >>
477
478 tokuhirom
479
480 Yappo
481
482 wu-lee
483
484 with plenty of code borrowed from L<Class::MOP> and L<Moose>
485
486 =head1 BUGS
487
488 There is a known issue with Mouse on 5.6.2 regarding the @ISA tests. Until
489 this is resolve the minimum version of Perl for Mouse is set to 5.8.0. Patches
490 to resolve these tests are more than welcome.
491
492 Please report any bugs through RT: email
493 C<bug-mouse at rt.cpan.org>, or browse
494 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
495
496 =head1 COPYRIGHT AND LICENSE
497
498 Copyright 2008 Shawn M Moore.
499
500 This program is free software; you can redistribute it and/or modify it
501 under the same terms as Perl itself.
502
503 =cut
504