add with qw( Role1 Role2 ) support
[gitmo/Mouse.git] / lib / Mouse.pm
1
2 package Mouse;
3 use strict;
4 use warnings;
5 use 5.006;
6 use base 'Exporter';
7
8 our $VERSION;
9 our $PurePerl;
10
11 BEGIN {
12     $VERSION  = '0.12';
13
14     if ($ENV{MOUSE_DEBUG}) {
15         *DEBUG = sub (){ 1 };
16     } else {
17         *DEBUG = sub (){ 0 };
18     }
19
20     if (! defined $PurePerl && $ENV{MOUSE_PUREPERL} && $ENV{MOUSE_PUREPERL} =~ /^(.+)$/) {
21         $PurePerl = $1;
22     }
23
24     if (! $PurePerl) {
25         local $@;
26         local $^W = 0;
27         require XSLoader;
28         $PurePerl = ! eval{ XSLoader::load(__PACKAGE__, $VERSION); 1 };
29         warn "Failed to load XS mode: $@" if $@; #  && Mouse::DEBUG();
30     }
31 }
32
33 use Carp 'confess';
34 use Mouse::Util 'blessed';
35
36 use Mouse::Meta::Attribute;
37 use Mouse::Meta::Class;
38 use Mouse::Object;
39 use Mouse::TypeRegistry;
40
41 our @EXPORT = qw(extends has before after around blessed confess with);
42
43 sub extends { Mouse::Meta::Class->initialize(caller)->superclasses(@_) }
44
45 sub has {
46     my $meta = Mouse::Meta::Class->initialize(caller);
47
48     my $names = shift;
49     $names = [$names] if !ref($names);
50
51     for my $name (@$names) {
52         if ($name =~ s/^\+//) {
53             Mouse::Meta::Attribute->clone_parent($meta, $name, @_);
54         }
55         else {
56             Mouse::Meta::Attribute->create($meta, $name, @_);
57         }
58     }
59 }
60
61 sub before {
62     my $meta = Mouse::Meta::Class->initialize(caller);
63
64     my $code = pop;
65
66     for (@_) {
67         $meta->add_before_method_modifier($_ => $code);
68     }
69 }
70
71 sub after {
72     my $meta = Mouse::Meta::Class->initialize(caller);
73
74     my $code = pop;
75
76     for (@_) {
77         $meta->add_after_method_modifier($_ => $code);
78     }
79 }
80
81 sub around {
82     my $meta = Mouse::Meta::Class->initialize(caller);
83
84     my $code = pop;
85
86     for (@_) {
87         $meta->add_around_method_modifier($_ => $code);
88     }
89 }
90
91 sub with {
92     Mouse::Util::apply_all_roles((caller)[0], @_);
93 }
94
95 sub import {
96     my $class = shift;
97
98     strict->import;
99     warnings->import;
100
101     my $caller = caller;
102
103     my $meta = Mouse::Meta::Class->initialize($caller);
104     $meta->superclasses('Mouse::Object')
105         unless $meta->superclasses;
106
107     no strict 'refs';
108     no warnings 'redefine';
109     *{$caller.'::meta'} = sub { $meta };
110
111     if (@_) {
112         __PACKAGE__->export_to_level( 1, $class, @_);
113     } else {
114         # shortcut for the common case of no type character
115         no strict 'refs';
116         for my $keyword (@EXPORT) {
117             *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
118         }
119     }
120 }
121
122 sub unimport {
123     my $caller = caller;
124
125     no strict 'refs';
126     for my $keyword (@EXPORT) {
127         delete ${ $caller . '::' }{$keyword};
128     }
129 }
130
131 sub load_class {
132     my $class = shift;
133
134     if (ref($class) || !defined($class) || !length($class)) {
135         my $display = defined($class) ? $class : 'undef';
136         confess "Invalid class name ($display)";
137     }
138
139     return 1 if is_class_loaded($class);
140
141     (my $file = "$class.pm") =~ s{::}{/}g;
142
143     eval { CORE::require($file) };
144     confess "Could not load class ($class) because : $@" if $@;
145
146     return 1;
147 }
148
149 sub is_class_loaded {
150     my $class = shift;
151
152     return 0 if ref($class) || !defined($class) || !length($class);
153
154     # walk the symbol table tree to avoid autovififying
155     # \*{${main::}{"Foo::"}} == \*main::Foo::
156
157     my $pack = \*::;
158     foreach my $part (split('::', $class)) {
159         return 0 unless exists ${$$pack}{"${part}::"};
160         $pack = \*{${$$pack}{"${part}::"}};
161     }
162
163     # check for $VERSION or @ISA
164     return 1 if exists ${$$pack}{VERSION}
165              && defined *{${$$pack}{VERSION}}{SCALAR};
166     return 1 if exists ${$$pack}{ISA}
167              && defined *{${$$pack}{ISA}}{ARRAY};
168
169     # check for any method
170     foreach ( keys %{$$pack} ) {
171         next if substr($_, -2, 2) eq '::';
172         return 1 if defined *{${$$pack}{$_}}{CODE};
173     }
174
175     # fail
176     return 0;
177 }
178
179 1;
180
181 __END__
182
183 =head1 NAME
184
185 Mouse - Moose minus the antlers
186
187 =head1 SYNOPSIS
188
189     package Point;
190     use Mouse; # automatically turns on strict and warnings
191
192     has 'x' => (is => 'rw', isa => 'Int');
193     has 'y' => (is => 'rw', isa => 'Int');
194
195     sub clear {
196         my $self = shift;
197         $self->x(0);
198         $self->y(0);
199     }
200
201     package Point3D;
202     use Mouse;
203
204     extends 'Point';
205
206     has 'z' => (is => 'rw', isa => 'Int');
207
208     after 'clear' => sub {
209         my $self = shift;
210         $self->z(0);
211     };
212
213 =head1 DESCRIPTION
214
215 L<Moose> is wonderful.
216
217 Unfortunately, it's a little slow. Though significant progress has been made
218 over the years, the compile time penalty is a non-starter for some
219 applications.
220
221 Mouse aims to alleviate this by providing a subset of Moose's
222 functionality, faster. In particular, L<Moose/has> is missing only a few
223 expert-level features.
224
225 We're also going as light on dependencies as possible. Most functions we use
226 from L<Scalar::Util> are copied into this dist. L<Scalar::Util> is required if
227 you'd like weak references; there's simply no way to do it from pure Perl.
228 L<Class::Method::Modifiers> is required if you want support for L</before>,
229 L</after>, and L</around>.
230
231 =head2 MOOSE COMPAT
232
233 Compatibility with Moose has been the utmost concern. Fewer than 1% of the
234 tests fail when run against Moose instead of Mouse. Mouse code coverage is also
235 over 96%. Even the error messages are taken from Moose. The Mouse code just
236 runs the test suite 4x faster.
237
238 The idea is that, if you need the extra power, you should be able to run
239 C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
240 nothingmuch has written L<Squirrel> (part of this distribution) which will act
241 as Mouse unless Moose is loaded, in which case it will act as Moose.
242
243 Mouse also has the blessings of Moose's author, stevan.
244
245 =head2 MISSING FEATURES
246
247 =head3 Roles
248
249 We're working on fixing this one! stevan has suggested an implementation
250 strategy. Mouse currently ignores methods, so that needs to be fixed next.
251 Roles that consist entirely of attributes may be usable in this very version.
252
253 =head3 Complex types
254
255 User-defined type constraints and parameterized types may be implemented. Type
256 coercions probably not (patches welcome).
257
258 =head3 Bootstrapped meta world
259
260 Very handy for extensions to the MOP. Not pressing, but would be nice to have.
261
262 =head3 Modification of attribute metaclass
263
264 When you declare an attribute with L</has>, you get the inlined accessors
265 installed immediately. Modifying the attribute metaclass, even if possible,
266 does nothing.
267
268 =head3 Lots more..
269
270 MouseX?
271
272 =head1 KEYWORDS
273
274 =head2 meta -> Mouse::Meta::Class
275
276 Returns this class' metaclass instance.
277
278 =head2 extends superclasses
279
280 Sets this class' superclasses.
281
282 =head2 before (method|methods) => Code
283
284 Installs a "before" method modifier. See L<Moose/before> or
285 L<Class::Method::Modifiers/before>.
286
287 Use of this feature requires L<Class::Method::Modifiers>!
288
289 =head2 after (method|methods) => Code
290
291 Installs an "after" method modifier. See L<Moose/after> or
292 L<Class::Method::Modifiers/after>.
293
294 Use of this feature requires L<Class::Method::Modifiers>!
295
296 =head2 around (method|methods) => Code
297
298 Installs an "around" method modifier. See L<Moose/around> or
299 L<Class::Method::Modifiers/around>.
300
301 Use of this feature requires L<Class::Method::Modifiers>!
302
303 =head2 has (name|names) => parameters
304
305 Adds an attribute (or if passed an arrayref of names, multiple attributes) to
306 this class. Options:
307
308 =over 4
309
310 =item is => ro|rw
311
312 If specified, inlines a read-only/read-write accessor with the same name as
313 the attribute.
314
315 =item isa => TypeConstraint
316
317 Provides basic type checking in the constructor and accessor. Basic types such
318 as C<Int>, C<ArrayRef>, C<Defined> are supported. Any unknown type is taken to
319 be a class check (e.g. isa => 'DateTime' would accept only L<DateTime>
320 objects).
321
322 =item required => 0|1
323
324 Whether this attribute is required to have a value. If the attribute is lazy or
325 has a builder, then providing a value for the attribute in the constructor is
326 optional.
327
328 =item init_arg => Str | Undef
329
330 Allows you to use a different key name in the constructor.  If undef, the
331 attribue can't be passed to the constructor.
332
333 =item default => Value | CodeRef
334
335 Sets the default value of the attribute. If the default is a coderef, it will
336 be invoked to get the default value. Due to quirks of Perl, any bare reference
337 is forbidden, you must wrap the reference in a coderef. Otherwise, all
338 instances will share the same reference.
339
340 =item lazy => 0|1
341
342 If specified, the default is calculated on demand instead of in the
343 constructor.
344
345 =item predicate => Str
346
347 Lets you specify a method name for installing a predicate method, which checks
348 that the attribute has a value. It will not invoke a lazy default or builder
349 method.
350
351 =item clearer => Str
352
353 Lets you specify a method name for installing a clearer method, which clears
354 the attribute's value from the instance. On the next read, lazy or builder will
355 be invoked.
356
357 =item handles => HashRef|ArrayRef
358
359 Lets you specify methods to delegate to the attribute. ArrayRef forwards the
360 given method names to method calls on the attribute. HashRef maps local method
361 names to remote method names called on the attribute. Other forms of
362 L</handles>, such as regular expression and coderef, are not yet supported.
363
364 =item weak_ref => 0|1
365
366 Lets you automatically weaken any reference stored in the attribute.
367
368 Use of this feature requires L<Scalar::Util>!
369
370 =item trigger => CodeRef
371
372 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.
373
374 Mouse 0.05 supported more complex triggers, but this behavior is now removed.
375
376 =item builder => Str
377
378 Defines a method name to be called to provide the default value of the
379 attribute. C<< builder => 'build_foo' >> is mostly equivalent to
380 C<< default => sub { $_[0]->build_foo } >>.
381
382 =item auto_deref => 0|1
383
384 Allows you to automatically dereference ArrayRef and HashRef attributes in list
385 context. In scalar context, the reference is returned (NOT the list length or
386 bucket status). You must specify an appropriate type constraint to use
387 auto_deref.
388
389 =item lazy_build => 0|1
390
391 Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
392 "clear_$attr', predicate => 'has_$attr' unless they are already defined.
393
394 =back
395
396 =head2 confess error -> BOOM
397
398 L<Carp/confess> for your convenience.
399
400 =head2 blessed value -> ClassName | undef
401
402 L<Scalar::Util/blessed> for your convenience.
403
404 =head1 MISC
405
406 =head2 import
407
408 Importing Mouse will default your class' superclass list to L<Mouse::Object>.
409 You may use L</extends> to replace the superclass list.
410
411 =head2 unimport
412
413 Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
414 keywords (such as L</extends>) it will break loudly instead breaking subtly.
415
416 =head1 FUNCTIONS
417
418 =head2 load_class Class::Name
419
420 This will load a given C<Class::Name> (or die if it's not loadable).
421 This function can be used in place of tricks like
422 C<eval "use $module"> or using C<require>.
423
424 =head2 is_class_loaded Class::Name -> Bool
425
426 Returns whether this class is actually loaded or not. It uses a heuristic which
427 involves checking for the existence of C<$VERSION>, C<@ISA>, and any
428 locally-defined method.
429
430 =head1 AUTHOR
431
432 Shawn M Moore, C<< <sartak at gmail.com> >>
433
434 Yuval Kogman, C<< <nothingmuch at woobling.org> >>
435
436 with plenty of code borrowed from L<Class::MOP> and L<Moose>
437
438 =head1 BUGS
439
440 No known bugs.
441
442 Please report any bugs through RT: email
443 C<bug-mouse at rt.cpan.org>, or browse
444 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
445
446 =head1 COPYRIGHT AND LICENSE
447
448 Copyright 2008 Shawn M Moore.
449
450 This program is free software; you can redistribute it and/or modify it
451 under the same terms as Perl itself.
452
453 =cut
454