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