Improve documents
[gitmo/Mouse.git] / lib / Mouse.pm
CommitLineData
c3398f5b 1package Mouse;
eb88905f 2use 5.006_002;
3
c3398f5b 4use strict;
5use warnings;
eb88905f 6
eaad7dab 7use base 'Exporter';
c3398f5b 8
87ca293b 9our $VERSION = '0.33_01';
c3398f5b 10
c3398f5b 11use Carp 'confess';
6c169c50 12use Scalar::Util 'blessed';
6d28c5cf 13
0740bdfa 14use Mouse::Util qw(load_class is_class_loaded not_supported);
c3398f5b 15
08f7a8db 16use Mouse::Meta::Module;
306290e8 17use Mouse::Meta::Class;
7a50b450 18use Mouse::Meta::Role;
6d28c5cf 19use Mouse::Meta::Attribute;
c3398f5b 20use Mouse::Object;
6d28c5cf 21use Mouse::Util::TypeConstraints ();
c3398f5b 22
2cb8b713 23our @EXPORT = qw(
24 extends with
25 has
26 before after around
27 override super
28 augment inner
29
30 blessed confess
31);
eaad7dab 32
3a63a2e7 33our %is_removable = map{ $_ => undef } @EXPORT;
34delete $is_removable{blessed};
35delete $is_removable{confess};
36
8bc2760b 37sub extends { Mouse::Meta::Class->initialize(scalar caller)->superclasses(@_) }
c3398f5b 38
eaad7dab 39sub has {
8bc2760b 40 my $meta = Mouse::Meta::Class->initialize(scalar caller);
1b9e472d 41 my $name = shift;
42
43 $meta->add_attribute($_ => @_) for ref($name) ? @{$name} : $name;
eaad7dab 44}
45
46sub before {
8bc2760b 47 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 48
49 my $code = pop;
50
51 for (@_) {
52 $meta->add_before_method_modifier($_ => $code);
53 }
54}
55
56sub after {
8bc2760b 57 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 58
59 my $code = pop;
60
61 for (@_) {
62 $meta->add_after_method_modifier($_ => $code);
63 }
64}
65
66sub around {
8bc2760b 67 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 68
69 my $code = pop;
70
71 for (@_) {
72 $meta->add_around_method_modifier($_ => $code);
73 }
74}
75
76sub with {
8bc2760b 77 Mouse::Util::apply_all_roles(scalar(caller), @_);
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
2cb8b713 110sub inner { not_supported }
111sub augment{ not_supported }
112
0d6e12be 113sub init_meta {
0d6e12be 114 shift;
115 my %args = @_;
116
117 my $class = $args{for_class}
382b7340 118 or confess("Cannot call init_meta without specifying a for_class");
0d6e12be 119 my $base_class = $args{base_class} || 'Mouse::Object';
120 my $metaclass = $args{metaclass} || 'Mouse::Meta::Class';
121
382b7340 122 confess("The Metaclass $metaclass must be a subclass of Mouse::Meta::Class.")
0d6e12be 123 unless $metaclass->isa('Mouse::Meta::Class');
382b7340 124
0d6e12be 125 # make a subtype for each Mouse class
6d28c5cf 126 Mouse::Util::TypeConstraints::class_type($class)
127 unless Mouse::Util::TypeConstraints::find_type_constraint($class);
0d6e12be 128
129 my $meta = $metaclass->initialize($class);
0d6e12be 130
3a63a2e7 131 $meta->add_method(meta => sub{
382b7340 132 return $metaclass->initialize(ref($_[0]) || $_[0]);
3a63a2e7 133 });
134
382b7340 135 $meta->superclasses($base_class)
136 unless $meta->superclasses;
0d6e12be 137
138 return $meta;
139}
140
eaad7dab 141sub import {
e15d73d2 142 my $class = shift;
143
eaad7dab 144 strict->import;
145 warnings->import;
146
bfcc8a05 147 my $opts = do {
148 if (ref($_[0]) && ref($_[0]) eq 'HASH') {
149 shift @_;
150 } else {
151 +{ };
152 }
153 };
154 my $level = delete $opts->{into_level};
155 $level = 0 unless defined $level;
156 my $caller = caller($level);
eaad7dab 157
7daedfff 158 # we should never export to main
159 if ($caller eq 'main') {
160 warn qq{$class does not export its sugar to the 'main' package.\n};
161 return;
162 }
163
382b7340 164 $class->init_meta(
0d6e12be 165 for_class => $caller,
166 );
eaad7dab 167
e15d73d2 168 if (@_) {
bfcc8a05 169 __PACKAGE__->export_to_level( $level+1, $class, @_);
e15d73d2 170 } else {
171 # shortcut for the common case of no type character
172 no strict 'refs';
173 for my $keyword (@EXPORT) {
174 *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
175 }
176 }
eaad7dab 177}
178
179sub unimport {
180 my $caller = caller;
181
3a63a2e7 182 my $stash = do{
183 no strict 'refs';
184 \%{$caller . '::'}
185 };
186
eaad7dab 187 for my $keyword (@EXPORT) {
3a63a2e7 188 my $code;
189 if(exists $is_removable{$keyword}
190 && ($code = $caller->can($keyword))
191 && (Mouse::Util::get_code_info($code))[0] eq __PACKAGE__){
192
193 delete $stash->{$keyword};
194 }
eaad7dab 195 }
196}
c3398f5b 197
c3398f5b 1981;
199
200__END__
201
202=head1 NAME
203
0fff36e6 204Mouse - Moose minus the antlers
c3398f5b 205
c3398f5b 206=head1 SYNOPSIS
207
208 package Point;
6caea456 209 use Mouse; # automatically turns on strict and warnings
210
211 has 'x' => (is => 'rw', isa => 'Int');
212 has 'y' => (is => 'rw', isa => 'Int');
213
214 sub clear {
215 my $self = shift;
216 $self->x(0);
217 $self->y(0);
218 }
219
220 package Point3D;
c3398f5b 221 use Mouse;
222
6caea456 223 extends 'Point';
c3398f5b 224
6caea456 225 has 'z' => (is => 'rw', isa => 'Int');
226
8517d2ff 227 after 'clear' => sub {
228 my $self = shift;
229 $self->z(0);
230 };
c3398f5b 231
232=head1 DESCRIPTION
233
6614c108 234L<Moose> is wonderful. B<Use Moose instead of Mouse.>
c3398f5b 235
16913e71 236Unfortunately, Moose has a compile-time penalty. Though significant progress
237has been made over the years, the compile time penalty is a non-starter for
238some very specific applications. If you are writing a command-line application
239or CGI script where startup time is essential, you may not be able to use
240Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
241latter, if possible.
0fff36e6 242
6614c108 243Mouse aims to alleviate this by providing a subset of Moose's functionality,
244faster.
0fff36e6 245
7ca75105 246We're also going as light on dependencies as possible.
3fcf8a33 247L<Class::Method::Modifiers::Fast> or L<Class::Method::Modifiers> is required
248if you want support for L</before>, L</after>, and L</around>.
d1c1b994 249
1820fffe 250=head2 MOOSE COMPATIBILITY
0fff36e6 251
252Compatibility with Moose has been the utmost concern. Fewer than 1% of the
253tests fail when run against Moose instead of Mouse. Mouse code coverage is also
7e3ed32e 254over 96%. Even the error messages are taken from Moose. The Mouse code just
255runs the test suite 4x faster.
0fff36e6 256
257The idea is that, if you need the extra power, you should be able to run
8e1a28a8 258C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
6614c108 259we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
16913e71 260in which case it will act as Moose. Since Mouse is a little sloppier than
261Moose, if you run into weird errors, it would be worth running:
262
263 ANY_MOOSE=Moose perl your-script.pl
264
265to see if the bug is caused by Mouse. Moose's diagnostics and validation are
266also much better.
0fff36e6 267
9090e5fe 268=head2 MouseX
269
270Please don't copy MooseX code to MouseX. If you need extensions, you really
271should upgrade to Moose. We don't need two parallel sets of extensions!
272
273If you really must write a Mouse extension, please contact the Moose mailing
274list or #moose on IRC beforehand.
275
56be135d 276=head2 Maintenance
277
278The original author of this module has mostly stepped down from maintaining
279Mouse. See L<http://www.nntp.perl.org/group/perl.moose/2009/04/msg653.html>.
280If you would like to help maintain this module, please get in touch with us.
281
0fff36e6 282=head1 KEYWORDS
c3398f5b 283
1820fffe 284=head2 C<< $object->meta -> Mouse::Meta::Class >>
c3398f5b 285
286Returns this class' metaclass instance.
287
1820fffe 288=head2 C<< extends superclasses >>
c3398f5b 289
290Sets this class' superclasses.
291
1820fffe 292=head2 C<< before (method|methods) => CodeRef >>
b7a74822 293
294Installs a "before" method modifier. See L<Moose/before> or
295L<Class::Method::Modifiers/before>.
296
6beb7db6 297Use of this feature requires L<Class::Method::Modifiers>!
298
1820fffe 299=head2 C<< after (method|methods) => CodeRef >>
b7a74822 300
301Installs an "after" method modifier. See L<Moose/after> or
302L<Class::Method::Modifiers/after>.
303
6beb7db6 304Use of this feature requires L<Class::Method::Modifiers>!
305
1820fffe 306=head2 C<< around (method|methods) => CodeRef >>
b7a74822 307
308Installs an "around" method modifier. See L<Moose/around> or
309L<Class::Method::Modifiers/around>.
310
6beb7db6 311Use of this feature requires L<Class::Method::Modifiers>!
312
1820fffe 313=head2 C<< has (name|names) => parameters >>
c3398f5b 314
315Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 316this class. Options:
317
318=over 4
319
1820fffe 320=item C<< is => ro|rw|bare >>
0fff36e6 321
322If specified, inlines a read-only/read-write accessor with the same name as
323the attribute.
324
1820fffe 325=item C<< isa => TypeConstraint >>
0fff36e6 326
5893ee36 327Provides type checking in the constructor and accessor. The following types are
1820fffe 328supported. Any unknown type is taken to be a class check
329(e.g. C<< isa => 'DateTime' >> would accept only L<DateTime> objects).
5893ee36 330
331 Any Item Bool Undef Defined Value Num Int Str ClassName
332 Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
333 FileHandle Object
334
335For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
336
0fff36e6 337
1820fffe 338=item C<< required => Bool >>
0fff36e6 339
340Whether this attribute is required to have a value. If the attribute is lazy or
341has a builder, then providing a value for the attribute in the constructor is
342optional.
343
1820fffe 344=item C<< init_arg => Str | Undef >>
0fff36e6 345
ca63d17a 346Allows you to use a different key name in the constructor. If undef, the
1820fffe 347attribute can't be passed to the constructor.
0fff36e6 348
1820fffe 349=item C<< default => Value | CodeRef >>
0fff36e6 350
351Sets the default value of the attribute. If the default is a coderef, it will
352be invoked to get the default value. Due to quirks of Perl, any bare reference
353is forbidden, you must wrap the reference in a coderef. Otherwise, all
354instances will share the same reference.
355
1820fffe 356=item C<< lazy => Bool >>
0fff36e6 357
358If specified, the default is calculated on demand instead of in the
359constructor.
360
1820fffe 361=item C<< predicate => Str >>
0fff36e6 362
363Lets you specify a method name for installing a predicate method, which checks
364that the attribute has a value. It will not invoke a lazy default or builder
365method.
366
1820fffe 367=item C<< clearer => Str >>
0fff36e6 368
369Lets you specify a method name for installing a clearer method, which clears
370the attribute's value from the instance. On the next read, lazy or builder will
371be invoked.
372
1820fffe 373=item C<< handles => HashRef|ArrayRef >>
0fff36e6 374
375Lets you specify methods to delegate to the attribute. ArrayRef forwards the
376given method names to method calls on the attribute. HashRef maps local method
377names to remote method names called on the attribute. Other forms of
378L</handles>, such as regular expression and coderef, are not yet supported.
379
1820fffe 380=item C<< weak_ref => Bool >>
0fff36e6 381
382Lets you automatically weaken any reference stored in the attribute.
383
6beb7db6 384Use of this feature requires L<Scalar::Util>!
385
1820fffe 386=item C<< trigger => CodeRef >>
844fa049 387
388Any 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.
389
1820fffe 390=item C<< builder => Str >>
0fff36e6 391
392Defines a method name to be called to provide the default value of the
393attribute. C<< builder => 'build_foo' >> is mostly equivalent to
394C<< default => sub { $_[0]->build_foo } >>.
395
1820fffe 396=item C<< auto_deref => Bool >>
0fff36e6 397
398Allows you to automatically dereference ArrayRef and HashRef attributes in list
399context. In scalar context, the reference is returned (NOT the list length or
400bucket status). You must specify an appropriate type constraint to use
401auto_deref.
402
1820fffe 403=item C<< lazy_build => Bool >>
404
405Automatically define the following options:
5253d13d 406
1820fffe 407 has $attr => (
408 # ...
409 lazy => 1
410 builder => "_build_$attr",
411 clearer => "clear_$attr",
412 predicate => "has_$attr",
413 );
5253d13d 414
0fff36e6 415=back
c3398f5b 416
1820fffe 417=head2 C<< confess(message) -> BOOM >>
c3398f5b 418
419L<Carp/confess> for your convenience.
420
1820fffe 421=head2 C<< blessed(value) -> ClassName | undef >>
c3398f5b 422
423L<Scalar::Util/blessed> for your convenience.
424
425=head1 MISC
426
427=head2 import
428
6caea456 429Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 430You may use L</extends> to replace the superclass list.
431
432=head2 unimport
433
0fff36e6 434Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
435keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 436
1820fffe 437=head1 SOURCE CODE ACCESS
c3398f5b 438
1820fffe 439We have a public git repository:
c3398f5b 440
1820fffe 441 git clone git://jules.scsys.co.uk/gitmo/Mouse.git
c3398f5b 442
1820fffe 443=head1 DEPENDENCIES
262801ef 444
1820fffe 445Perl 5.6.2 or later.
262801ef 446
1820fffe 447=head1 SEE ALSO
e693975f 448
1820fffe 449L<Moose>
e693975f 450
1820fffe 451L<Class::MOP>
e693975f 452
c817e8f1 453=head1 AUTHORS
c3398f5b 454
455Shawn M Moore, C<< <sartak at gmail.com> >>
456
fc9f8988 457Yuval Kogman, C<< <nothingmuch at woobling.org> >>
458
c817e8f1 459tokuhirom
460
461Yappo
462
ea6dc3a5 463wu-lee
464
ba55dea1 465Goro Fuji (gfx) C<< <gfuji at cpan.org> >>
466
0fff36e6 467with plenty of code borrowed from L<Class::MOP> and L<Moose>
468
c3398f5b 469=head1 BUGS
470
1820fffe 471All complex software has bugs lurking in it, and this module is no exception.
472Please report any bugs to C<bug-mouse at rt.cpan.org>, or through the web
473interface at L<http://rt.cpan.org/Public/Dist/Display.html?Name=Mouse>
c3398f5b 474
475=head1 COPYRIGHT AND LICENSE
476
3ef6ae56 477Copyright 2008-2009 Infinity Interactive, Inc.
478
479http://www.iinteractive.com/
c3398f5b 480
481This program is free software; you can redistribute it and/or modify it
482under the same terms as Perl itself.
483
484=cut
485