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