Skip squirrel tests when munging s/Mouse/Moose/
[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
0fff36e6 231=head1 KEYWORDS
c3398f5b 232
306290e8 233=head2 meta -> Mouse::Meta::Class
c3398f5b 234
235Returns this class' metaclass instance.
236
237=head2 extends superclasses
238
239Sets this class' superclasses.
240
b7a74822 241=head2 before (method|methods) => Code
242
243Installs a "before" method modifier. See L<Moose/before> or
244L<Class::Method::Modifiers/before>.
245
6beb7db6 246Use of this feature requires L<Class::Method::Modifiers>!
247
b7a74822 248=head2 after (method|methods) => Code
249
250Installs an "after" method modifier. See L<Moose/after> or
251L<Class::Method::Modifiers/after>.
252
6beb7db6 253Use of this feature requires L<Class::Method::Modifiers>!
254
b7a74822 255=head2 around (method|methods) => Code
256
257Installs an "around" method modifier. See L<Moose/around> or
258L<Class::Method::Modifiers/around>.
259
6beb7db6 260Use of this feature requires L<Class::Method::Modifiers>!
261
c3398f5b 262=head2 has (name|names) => parameters
263
264Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 265this class. Options:
266
267=over 4
268
269=item is => ro|rw
270
271If specified, inlines a read-only/read-write accessor with the same name as
272the attribute.
273
274=item isa => TypeConstraint
275
276Provides basic type checking in the constructor and accessor. Basic types such
277as C<Int>, C<ArrayRef>, C<Defined> are supported. Any unknown type is taken to
278be a class check (e.g. isa => 'DateTime' would accept only L<DateTime>
279objects).
280
281=item required => 0|1
282
283Whether this attribute is required to have a value. If the attribute is lazy or
284has a builder, then providing a value for the attribute in the constructor is
285optional.
286
ca63d17a 287=item init_arg => Str | Undef
0fff36e6 288
ca63d17a 289Allows you to use a different key name in the constructor. If undef, the
290attribue can't be passed to the constructor.
0fff36e6 291
292=item default => Value | CodeRef
293
294Sets the default value of the attribute. If the default is a coderef, it will
295be invoked to get the default value. Due to quirks of Perl, any bare reference
296is forbidden, you must wrap the reference in a coderef. Otherwise, all
297instances will share the same reference.
298
299=item lazy => 0|1
300
301If specified, the default is calculated on demand instead of in the
302constructor.
303
304=item predicate => Str
305
306Lets you specify a method name for installing a predicate method, which checks
307that the attribute has a value. It will not invoke a lazy default or builder
308method.
309
310=item clearer => Str
311
312Lets you specify a method name for installing a clearer method, which clears
313the attribute's value from the instance. On the next read, lazy or builder will
314be invoked.
315
316=item handles => HashRef|ArrayRef
317
318Lets you specify methods to delegate to the attribute. ArrayRef forwards the
319given method names to method calls on the attribute. HashRef maps local method
320names to remote method names called on the attribute. Other forms of
321L</handles>, such as regular expression and coderef, are not yet supported.
322
323=item weak_ref => 0|1
324
325Lets you automatically weaken any reference stored in the attribute.
326
6beb7db6 327Use of this feature requires L<Scalar::Util>!
328
844fa049 329=item trigger => CodeRef
330
331Any 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.
332
6beb7db6 333Mouse 0.05 supported more complex triggers, but this behavior is now removed.
0fff36e6 334
335=item builder => Str
336
337Defines a method name to be called to provide the default value of the
338attribute. C<< builder => 'build_foo' >> is mostly equivalent to
339C<< default => sub { $_[0]->build_foo } >>.
340
341=item auto_deref => 0|1
342
343Allows you to automatically dereference ArrayRef and HashRef attributes in list
344context. In scalar context, the reference is returned (NOT the list length or
345bucket status). You must specify an appropriate type constraint to use
346auto_deref.
347
5253d13d 348=item lazy_build => 0|1
349
350Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
351"clear_$attr', predicate => 'has_$attr' unless they are already defined.
352
0fff36e6 353=back
c3398f5b 354
355=head2 confess error -> BOOM
356
357L<Carp/confess> for your convenience.
358
359=head2 blessed value -> ClassName | undef
360
361L<Scalar::Util/blessed> for your convenience.
362
363=head1 MISC
364
365=head2 import
366
6caea456 367Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 368You may use L</extends> to replace the superclass list.
369
370=head2 unimport
371
0fff36e6 372Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
373keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 374
375=head1 FUNCTIONS
376
377=head2 load_class Class::Name
378
6caea456 379This will load a given C<Class::Name> (or die if it's not loadable).
c3398f5b 380This function can be used in place of tricks like
381C<eval "use $module"> or using C<require>.
382
262801ef 383=head2 is_class_loaded Class::Name -> Bool
384
385Returns whether this class is actually loaded or not. It uses a heuristic which
386involves checking for the existence of C<$VERSION>, C<@ISA>, and any
387locally-defined method.
388
c817e8f1 389=head1 AUTHORS
c3398f5b 390
391Shawn M Moore, C<< <sartak at gmail.com> >>
392
fc9f8988 393Yuval Kogman, C<< <nothingmuch at woobling.org> >>
394
c817e8f1 395tokuhirom
396
397Yappo
398
0fff36e6 399with plenty of code borrowed from L<Class::MOP> and L<Moose>
400
c3398f5b 401=head1 BUGS
402
403No known bugs.
404
405Please report any bugs through RT: email
406C<bug-mouse at rt.cpan.org>, or browse
407L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
408
409=head1 COPYRIGHT AND LICENSE
410
411Copyright 2008 Shawn M Moore.
412
413This program is free software; you can redistribute it and/or modify it
414under the same terms as Perl itself.
415
416=cut
417