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