Bump to 0.20
[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.20';
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 import {
92     my $class = shift;
93
94     strict->import;
95     warnings->import;
96
97     my $opts = do {
98         if (ref($_[0]) && ref($_[0]) eq 'HASH') {
99             shift @_;
100         } else {
101             +{ };
102         }
103     };
104     my $level = delete $opts->{into_level};
105        $level = 0 unless defined $level;
106     my $caller = caller($level);
107
108     # we should never export to main
109     if ($caller eq 'main') {
110         warn qq{$class does not export its sugar to the 'main' package.\n};
111         return;
112     }
113
114     my $meta = Mouse::Meta::Class->initialize($caller);
115     $meta->superclasses('Mouse::Object')
116         unless $meta->superclasses;
117
118     no strict 'refs';
119     no warnings 'redefine';
120     *{$caller.'::meta'} = sub { $meta };
121
122     if (@_) {
123         __PACKAGE__->export_to_level( $level+1, $class, @_);
124     } else {
125         # shortcut for the common case of no type character
126         no strict 'refs';
127         for my $keyword (@EXPORT) {
128             *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
129         }
130     }
131 }
132
133 sub unimport {
134     my $caller = caller;
135
136     no strict 'refs';
137     for my $keyword (@EXPORT) {
138         delete ${ $caller . '::' }{$keyword};
139     }
140 }
141
142 sub load_class {
143     my $class = shift;
144
145     if (ref($class) || !defined($class) || !length($class)) {
146         my $display = defined($class) ? $class : 'undef';
147         confess "Invalid class name ($display)";
148     }
149
150     return 1 if $class eq 'Mouse::Object';
151     return 1 if is_class_loaded($class);
152
153     (my $file = "$class.pm") =~ s{::}{/}g;
154
155     eval { CORE::require($file) };
156     confess "Could not load class ($class) because : $@" if $@;
157
158     return 1;
159 }
160
161 sub is_class_loaded {
162     my $class = shift;
163
164     return 0 if ref($class) || !defined($class) || !length($class);
165
166     # walk the symbol table tree to avoid autovififying
167     # \*{${main::}{"Foo::"}} == \*main::Foo::
168
169     my $pack = \*::;
170     foreach my $part (split('::', $class)) {
171         return 0 unless exists ${$$pack}{"${part}::"};
172         $pack = \*{${$$pack}{"${part}::"}};
173     }
174
175     # check for $VERSION or @ISA
176     return 1 if exists ${$$pack}{VERSION}
177              && defined *{${$$pack}{VERSION}}{SCALAR};
178     return 1 if exists ${$$pack}{ISA}
179              && defined *{${$$pack}{ISA}}{ARRAY};
180
181     # check for any method
182     foreach ( keys %{$$pack} ) {
183         next if substr($_, -2, 2) eq '::';
184         return 1 if defined *{${$$pack}{$_}}{CODE};
185     }
186
187     # fail
188     return 0;
189 }
190
191 1;
192
193 __END__
194
195 =head1 NAME
196
197 Mouse - Moose minus the antlers
198
199 =head1 SYNOPSIS
200
201     package Point;
202     use Mouse; # automatically turns on strict and warnings
203
204     has 'x' => (is => 'rw', isa => 'Int');
205     has 'y' => (is => 'rw', isa => 'Int');
206
207     sub clear {
208         my $self = shift;
209         $self->x(0);
210         $self->y(0);
211     }
212
213     package Point3D;
214     use Mouse;
215
216     extends 'Point';
217
218     has 'z' => (is => 'rw', isa => 'Int');
219
220     after 'clear' => sub {
221         my $self = shift;
222         $self->z(0);
223     };
224
225 =head1 DESCRIPTION
226
227 L<Moose> is wonderful.
228
229 Unfortunately, it's a little slow. Though significant progress has been made
230 over the years, the compile time penalty is a non-starter for some
231 applications.
232
233 Mouse aims to alleviate this by providing a subset of Moose's
234 functionality, faster. In particular, L<Moose/has> is missing only a few
235 expert-level features.
236
237 We're also going as light on dependencies as possible.
238 L<Class::Method::Modifiers> or L<Data::Util> is required if you want support
239 for L</before>, L</after>, and L</around>.
240
241 =head2 MOOSE COMPAT
242
243 Compatibility with Moose has been the utmost concern. Fewer than 1% of the
244 tests fail when run against Moose instead of Mouse. Mouse code coverage is also
245 over 96%. Even the error messages are taken from Moose. The Mouse code just
246 runs the test suite 4x faster.
247
248 The idea is that, if you need the extra power, you should be able to run
249 C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
250 nothingmuch has written L<Squirrel> (part of this distribution) which will act
251 as Mouse unless Moose is loaded, in which case it will act as Moose.
252 L<Any::Moose> is a more high-tech L<Squirrel>.
253
254 =head2 MouseX
255
256 Please don't copy MooseX code to MouseX. If you need extensions, you really
257 should upgrade to Moose. We don't need two parallel sets of extensions!
258
259 If you really must write a Mouse extension, please contact the Moose mailing
260 list or #moose on IRC beforehand.
261
262 =head1 KEYWORDS
263
264 =head2 meta -> Mouse::Meta::Class
265
266 Returns this class' metaclass instance.
267
268 =head2 extends superclasses
269
270 Sets this class' superclasses.
271
272 =head2 before (method|methods) => Code
273
274 Installs a "before" method modifier. See L<Moose/before> or
275 L<Class::Method::Modifiers/before>.
276
277 Use of this feature requires L<Class::Method::Modifiers>!
278
279 =head2 after (method|methods) => Code
280
281 Installs an "after" method modifier. See L<Moose/after> or
282 L<Class::Method::Modifiers/after>.
283
284 Use of this feature requires L<Class::Method::Modifiers>!
285
286 =head2 around (method|methods) => Code
287
288 Installs an "around" method modifier. See L<Moose/around> or
289 L<Class::Method::Modifiers/around>.
290
291 Use of this feature requires L<Class::Method::Modifiers>!
292
293 =head2 has (name|names) => parameters
294
295 Adds an attribute (or if passed an arrayref of names, multiple attributes) to
296 this class. Options:
297
298 =over 4
299
300 =item is => ro|rw
301
302 If specified, inlines a read-only/read-write accessor with the same name as
303 the attribute.
304
305 =item isa => TypeConstraint
306
307 Provides basic type checking in the constructor and accessor. Basic types such
308 as C<Int>, C<ArrayRef>, C<Defined> are supported. Any unknown type is taken to
309 be a class check (e.g. isa => 'DateTime' would accept only L<DateTime>
310 objects).
311
312 =item required => 0|1
313
314 Whether this attribute is required to have a value. If the attribute is lazy or
315 has a builder, then providing a value for the attribute in the constructor is
316 optional.
317
318 =item init_arg => Str | Undef
319
320 Allows you to use a different key name in the constructor.  If undef, the
321 attribue can't be passed to the constructor.
322
323 =item default => Value | CodeRef
324
325 Sets the default value of the attribute. If the default is a coderef, it will
326 be invoked to get the default value. Due to quirks of Perl, any bare reference
327 is forbidden, you must wrap the reference in a coderef. Otherwise, all
328 instances will share the same reference.
329
330 =item lazy => 0|1
331
332 If specified, the default is calculated on demand instead of in the
333 constructor.
334
335 =item predicate => Str
336
337 Lets you specify a method name for installing a predicate method, which checks
338 that the attribute has a value. It will not invoke a lazy default or builder
339 method.
340
341 =item clearer => Str
342
343 Lets you specify a method name for installing a clearer method, which clears
344 the attribute's value from the instance. On the next read, lazy or builder will
345 be invoked.
346
347 =item handles => HashRef|ArrayRef
348
349 Lets you specify methods to delegate to the attribute. ArrayRef forwards the
350 given method names to method calls on the attribute. HashRef maps local method
351 names to remote method names called on the attribute. Other forms of
352 L</handles>, such as regular expression and coderef, are not yet supported.
353
354 =item weak_ref => 0|1
355
356 Lets you automatically weaken any reference stored in the attribute.
357
358 Use of this feature requires L<Scalar::Util>!
359
360 =item trigger => CodeRef
361
362 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.
363
364 Mouse 0.05 supported more complex triggers, but this behavior is now removed.
365
366 =item builder => Str
367
368 Defines a method name to be called to provide the default value of the
369 attribute. C<< builder => 'build_foo' >> is mostly equivalent to
370 C<< default => sub { $_[0]->build_foo } >>.
371
372 =item auto_deref => 0|1
373
374 Allows you to automatically dereference ArrayRef and HashRef attributes in list
375 context. In scalar context, the reference is returned (NOT the list length or
376 bucket status). You must specify an appropriate type constraint to use
377 auto_deref.
378
379 =item lazy_build => 0|1
380
381 Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
382 "clear_$attr', predicate => 'has_$attr' unless they are already defined.
383
384 =back
385
386 =head2 confess error -> BOOM
387
388 L<Carp/confess> for your convenience.
389
390 =head2 blessed value -> ClassName | undef
391
392 L<Scalar::Util/blessed> for your convenience.
393
394 =head1 MISC
395
396 =head2 import
397
398 Importing Mouse will default your class' superclass list to L<Mouse::Object>.
399 You may use L</extends> to replace the superclass list.
400
401 =head2 unimport
402
403 Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
404 keywords (such as L</extends>) it will break loudly instead breaking subtly.
405
406 =head1 FUNCTIONS
407
408 =head2 load_class Class::Name
409
410 This will load a given C<Class::Name> (or die if it's not loadable).
411 This function can be used in place of tricks like
412 C<eval "use $module"> or using C<require>.
413
414 =head2 is_class_loaded Class::Name -> Bool
415
416 Returns whether this class is actually loaded or not. It uses a heuristic which
417 involves checking for the existence of C<$VERSION>, C<@ISA>, and any
418 locally-defined method.
419
420 =head1 AUTHORS
421
422 Shawn M Moore, C<< <sartak at gmail.com> >>
423
424 Yuval Kogman, C<< <nothingmuch at woobling.org> >>
425
426 tokuhirom
427
428 Yappo
429
430 with plenty of code borrowed from L<Class::MOP> and L<Moose>
431
432 =head1 BUGS
433
434 No known bugs.
435
436 Please report any bugs through RT: email
437 C<bug-mouse at rt.cpan.org>, or browse
438 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
439
440 =head1 COPYRIGHT AND LICENSE
441
442 Copyright 2008 Shawn M Moore.
443
444 This program is free software; you can redistribute it and/or modify it
445 under the same terms as Perl itself.
446
447 =cut
448