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