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