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