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