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