auto-moose
[gitmo/Moo.git] / lib / Moo.pm
CommitLineData
b1eebd55 1package Moo;
6c74d087 2
3use strictures 1;
b1eebd55 4use Moo::_Utils;
e0e12d16 5use B 'perlstring';
6c74d087 6
487c31f3 7our $VERSION = '0.009014'; # 0.9.13
6d71fae7 8$VERSION = eval $VERSION;
9
8c46a8f6 10sub Moo::HandleMoose::AuthorityHack::DESTROY {
11 require Moo::HandleMoose;
12 Moo::HandleMoose->import;
13}
14
15if ($INC{"Moose.pm"}) {
16 require Moo::HandleMoose;
17 Moo::HandleMoose->import;
18} else {
19 $Moose::AUTHORITY = bless({}, 'Moo::HandleMoose::AuthorityHack');
20}
21
14f32032 22our %MAKERS;
23
6c74d087 24sub import {
25 my $target = caller;
a16d301e 26 my $class = shift;
de3d4906 27 strictures->import;
1ba11455 28 return if $MAKERS{$target}; # already exported into this package
6c74d087 29 *{_getglob("${target}::extends")} = sub {
fb5074f6 30 _load_module($_) for @_;
786e5ba0 31 # Can't do *{...} = \@_ or 5.10.0's mro.pm stops seeing @ISA
32 @{*{_getglob("${target}::ISA")}{ARRAY}} = @_;
6c74d087 33 };
34 *{_getglob("${target}::with")} = sub {
faa9ce11 35 require Moo::Role;
6c74d087 36 die "Only one role supported at a time by with" if @_ > 1;
369a4c50 37 Moo::Role->apply_role_to_package($target, $_[0]);
6c74d087 38 };
a16d301e 39 $MAKERS{$target} = {};
14f32032 40 *{_getglob("${target}::has")} = sub {
41 my ($name, %spec) = @_;
42 ($MAKERS{$target}{accessor} ||= do {
faa9ce11 43 require Method::Generate::Accessor;
14f32032 44 Method::Generate::Accessor->new
45 })->generate_method($target, $name, \%spec);
a16d301e 46 $class->_constructor_maker_for($target)
47 ->register_attribute_specs($name, \%spec);
14f32032 48 };
6c74d087 49 foreach my $type (qw(before after around)) {
50 *{_getglob "${target}::${type}"} = sub {
faa9ce11 51 require Class::Method::Modifiers;
6c74d087 52 _install_modifier($target, $type, @_);
53 };
54 }
55 {
56 no strict 'refs';
57 @{"${target}::ISA"} = do {
faa9ce11 58 require Moo::Object; ('Moo::Object');
6c74d087 59 } unless @{"${target}::ISA"};
60 }
3362e41c 61 if ($INC{'Moo/HandleMoose.pm'}) {
62 Moo::HandleMoose::inject_fake_metaclass_for($target);
63 }
6c74d087 64}
65
a16d301e 66sub _constructor_maker_for {
c4570291 67 my ($class, $target, $select_super) = @_;
a16d301e 68 return unless $MAKERS{$target};
69 $MAKERS{$target}{constructor} ||= do {
faa9ce11 70 require Method::Generate::Constructor;
71 require Sub::Defer;
c4570291 72 my ($moo_constructor, $con);
de5c0e53 73
c4570291 74 if ($select_super && $MAKERS{$select_super}) {
75 $moo_constructor = 1;
76 $con = $MAKERS{$select_super}{constructor};
77 } else {
de5c0e53 78 my $t_new = $target->can('new');
c4570291 79 if ($t_new) {
80 if ($t_new == Moo::Object->can('new')) {
81 $moo_constructor = 1;
82 } elsif (my $defer_target = (Sub::Defer::defer_info($t_new)||[])->[0]) {
83 my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
84 if ($MAKERS{$pkg}) {
85 $moo_constructor = 1;
86 $con = $MAKERS{$pkg}{constructor};
87 }
88 }
89 } else {
90 $moo_constructor = 1; # no other constructor, make a Moo one
91 }
de5c0e53 92 };
a16d301e 93 Method::Generate::Constructor
94 ->new(
95 package => $target,
96 accessor_generator => do {
faa9ce11 97 require Method::Generate::Accessor;
a16d301e 98 Method::Generate::Accessor->new;
de5c0e53 99 },
53875e2c 100 construction_string => (
101 $moo_constructor
102 ? ($con ? $con->construction_string : undef)
103 : ('$class->'.$target.'::SUPER::new(@_)')
e0e12d16 104 ),
105 subconstructor_generator => (
106 $class.'->_constructor_maker_for($class,'.perlstring($target).')'
107 ),
a16d301e 108 )
109 ->install_delayed
de5c0e53 110 ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}})
a16d301e 111 }
112}
113
6c74d087 1141;
a17be455 115=pod
116
117=encoding utf-8
8146585e 118
505f8b7a 119=head1 NAME
120
121Moo - Minimalist Object Orientation (with Moose compatiblity)
122
8146585e 123=head1 SYNOPSIS
124
125 package Cat::Food;
126
127 use Moo;
128 use Sub::Quote;
129
130 sub feed_lion {
131 my $self = shift;
132 my $amount = shift || 1;
133
134 $self->pounds( $self->pounds - $amount );
135 }
136
137 has taste => (
138 is => 'ro',
139 );
140
141 has brand => (
142 is => 'ro',
143 isa => sub {
144 die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
145 },
146);
147
148 has pounds => (
149 is => 'rw',
150 isa => quote_sub q{ die "$_[0] is too much cat food!" unless $_[0] < 15 },
151 );
152
153 1;
154
155and else where
156
157 my $full = Cat::Food->new(
158 taste => 'DELICIOUS.',
159 brand => 'SWEET-TREATZ',
160 pounds => 10,
161 );
162
163 $full->feed_lion;
164
165 say $full->pounds;
166
167=head1 DESCRIPTION
168
169This module is an extremely light-weight, high-performance L<Moose> replacement.
170It also avoids depending on any XS modules to allow simple deployments. The
171name C<Moo> is based on the idea that it provides almost -but not quite- two
172thirds of L<Moose>.
173
174Unlike C<Mouse> this module does not aim at full L<Moose> compatibility. See
175L</INCOMPATIBILITIES> for more details.
176
5d5bb71d 177=head1 WHY MOO EXISTS
178
179If you want a full object system with a rich Metaprotocol, L<Moose> is
180already wonderful.
181
182I've tried several times to use L<Mouse> but it's 3x the size of Moo and
183takes longer to load than most of my Moo based CGI scripts take to run.
184
185If you don't want L<Moose>, you don't want "less metaprotocol" like L<Mouse>,
186you want "as little as possible" - which means "no metaprotocol", which is
187what Moo provides.
188
189By Moo 1.0 I intend to have Moo's equivalent of L<Any::Moose> built in -
190if Moose gets loaded, any Moo class or role will act as a Moose equivalent
191if treated as such.
192
193Hence - Moo exists as its name - Minimal Object Orientation - with a pledge
194to make it smooth to upgrade to L<Moose> when you need more than minimal
195features.
196
8146585e 197=head1 IMPORTED METHODS
198
199=head2 new
200
201 Foo::Bar->new( attr1 => 3 );
202
203or
204
205 Foo::Bar->new({ attr1 => 3 });
206
2e575bcd 207=head2 BUILDARGS
208
a17be455 209 around BUILDARGS => sub {
210 my $orig = shift;
211 my ( $class, @args ) = @_;
212
213 unshift @args, "attr1" if @args % 2 == 1;
214
215 return $class->$orig(@args);
216 };
217
218 Foo::Bar->new( 3 );
219
220The default implementation of this method accepts a hash or hash reference of
221named parameters. If it receives a single argument that isn't a hash reference
222it throws an error.
223
224You can override this method in your class to handle other types of options
225passed to the constructor.
226
227This method should always return a hash reference of named options.
2e575bcd 228
2d00f3d6 229=head2 BUILD
8146585e 230
2d00f3d6 231Define a C<BUILD> method on your class and the constructor will automatically
232call the C<BUILD> method from parent down to child after the object has
233been instantiated. Typically this is used for object validation or possibly
234logging.
8146585e 235
2d00f3d6 236=head2 DEMOLISH
c2cc003f 237
debb3fcd 238If you have a C<DEMOLISH> method anywhere in your inheritance hierarchy,
239a C<DESTROY> method is created on first object construction which will call
c2cc003f 240C<< $instance->DEMOLISH($in_global_destruction) >> for each C<DEMOLISH>
debb3fcd 241method from child upwards to parents.
242
243Note that the C<DESTROY> method is created on first construction of an object
244of your class in order to not add overhead to classes without C<DEMOLISH>
245methods; this may prove slightly surprising if you try and define your own.
c2cc003f 246
8146585e 247=head2 does
248
249 if ($foo->does('Some::Role1')) {
250 ...
251 }
252
253Returns true if the object composes in the passed role.
254
255=head1 IMPORTED SUBROUTINES
256
257=head2 extends
258
259 extends 'Parent::Class';
260
2e575bcd 261Declares base class. Multiple superclasses can be passed for multiple
262inheritance (but please use roles instead).
263
264Calling extends more than once will REPLACE your superclasses, not add to
265them like 'use base' would.
8146585e 266
267=head2 with
268
269 with 'Some::Role1';
270 with 'Some::Role2';
271
272Composes a L<Role::Tiny> into current class. Only one role may be composed in
273at a time to allow the code to remain as simple as possible.
274
275=head2 has
276
277 has attr => (
278 is => 'ro',
279 );
280
281Declares an attribute for the class.
282
283The options for C<has> are as follows:
284
285=over 2
286
287=item * is
288
289B<required>, must be C<ro> or C<rw>. Unsurprisingly, C<ro> generates an
0654a8fa 290accessor that will not respond to arguments; to be clear: a getter only. C<rw>
8146585e 291will create a perlish getter/setter.
292
293=item * isa
294
295Takes a coderef which is meant to validate the attribute. Unlike L<Moose> Moo
296does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
297one should do
298
299 isa => quote_sub q{
300 die "$_[0] is not a number!" unless looks_like_number $_[0]
301 },
302
303L<Sub::Quote aware|/SUB QUOTE AWARE>
304
305=item * coerce
306
307Takes a coderef which is meant to coerce the attribute. The basic idea is to
308do something like the following:
309
310 coerce => quote_sub q{
311 $_[0] + 1 unless $_[0] % 2
312 },
313
23a3e34e 314Coerce does not require C<isa> to be defined.
8146585e 315
23a3e34e 316L<Sub::Quote aware|/SUB QUOTE AWARE>
2e575bcd 317
e1efec09 318=item * handles
319
320Takes a string
321
69673ca7 322 handles => 'RobotRole'
323
324Where C<RobotRole> is a role (L<Moo::Role>) that defines an interface which
325becomes the list of methods to handle.
e1efec09 326
327Takes a list of methods
328
329 handles => [ qw( one two ) ]
330
331Takes a hashref
332
333 handles => {
334 un => 'one',
335 }
336
8146585e 337=item * trigger
338
339Takes a coderef which will get called any time the attribute is set. Coderef
340will be invoked against the object with the new value as an argument.
341
2e575bcd 342Note that Moose also passes the old value, if any; this feature is not yet
343supported.
344
8146585e 345L<Sub::Quote aware|/SUB QUOTE AWARE>
346
347=item * default
348
2e575bcd 349Takes a coderef which will get called with $self as its only argument
350to populate an attribute if no value is supplied to the constructor - or
351if the attribute is lazy, when the attribute is first retrieved if no
352value has yet been provided.
353
354Note that if your default is fired during new() there is no guarantee that
355other attributes have been populated yet so you should not rely on their
356existence.
8146585e 357
358L<Sub::Quote aware|/SUB QUOTE AWARE>
359
360=item * predicate
361
2e575bcd 362Takes a method name which will return true if an attribute has a value.
8146585e 363
364A common example of this would be to call it C<has_$foo>, implying that the
365object has a C<$foo> set.
366
367=item * builder
368
2e575bcd 369Takes a method name which will be called to create the attribute - functions
370exactly like default except that instead of calling
371
372 $default->($self);
373
374Moo will call
375
376 $self->$builder;
8146585e 377
378=item * clearer
379
380Takes a method name which will clear the attribute.
381
382=item * lazy
383
384B<Boolean>. Set this if you want values for the attribute to be grabbed
385lazily. This is usually a good idea if you have a L</builder> which requires
386another attribute to be set.
387
388=item * required
389
390B<Boolean>. Set this if the attribute must be passed on instantiation.
391
1eba910c 392=item * reader
393
394The value of this attribute will be the name of the method to get the value of
395the attribute. If you like Java style methods, you might set this to
396C<get_foo>
397
398=item * writer
399
400The value of this attribute will be the name of the method to set the value of
401the attribute. If you like Java style methods, you might set this to
402C<set_foo>
403
8146585e 404=item * weak_ref
405
406B<Boolean>. Set this if you want the reference that the attribute contains to
407be weakened; use this when circular references are possible, which will cause
408leaks.
409
410=item * init_arg
411
412Takes the name of the key to look for at instantiation time of the object. A
413common use of this is to make an underscored attribute have a non-underscored
414initialization name. C<undef> means that passing the value in on instantiation
415
416=back
417
418=head2 before
419
420 before foo => sub { ... };
421
422See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
423documentation.
424
425=head2 around
426
427 around foo => sub { ... };
428
429See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
430documentation.
431
432=head2 after
433
434 after foo => sub { ... };
435
436See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
437documentation.
438
8146585e 439=head1 SUB QUOTE AWARE
440
441L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
442giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
443aware can take advantage of this.
444
2e575bcd 445=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 446
447You can only compose one role at a time. If your application is large or
5902c1fc 448complex enough to warrant complex composition, you wanted L<Moose>. Note that
449this does not mean you can only compose one role per class -
8146585e 450
5902c1fc 451 with 'FirstRole';
452 with 'SecondRole';
453
454is absolutely fine, there's just currently no equivalent of Moose's
455
456 with 'FirstRole', 'SecondRole';
457
458which composes the two roles together, and then applies them.
459
460There is no built in type system. C<isa> is verified with a coderef, if you
8146585e 461need complex types, just make a library of coderefs, or better yet, functions
5902c1fc 462that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
463to L<MooseX::Types::Moose> so that you can write
464
465 has days_to_live => (is => 'ro', isa => Int);
466
467and have it work with both; it is hoped that providing only subrefs as an
468API will encourage the use of other type systems as well, since it's
469probably the weakest part of Moose design-wise.
8146585e 470
2e575bcd 471C<initializer> is not supported in core since the author considers it to be a
472bad idea but may be supported by an extension in future.
8146585e 473
474There is no meta object. If you need this level of complexity you wanted
2e575bcd 475L<Moose> - Moo succeeds at being small because it explicitly does not
476provide a metaprotocol.
8146585e 477
2e575bcd 478No support for C<super>, C<override>, C<inner>, or C<augment> - override can
479be handled by around albeit with a little more typing, and the author considers
480augment to be a bad idea.
8146585e 481
c96a6326 482The C<dump> method is not provided by default. The author suggests loading
483L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
484using C<$obj-E<gt>$::Dwarn()> instead.
485
8146585e 486L</default> only supports coderefs, because doing otherwise is usually a
487mistake anyway.
488
489C<lazy_build> is not supported per se, but of course it will work if you
490manually set all the options it implies.
491
2e575bcd 492C<auto_deref> is not supported since the author considers it a bad idea.
8146585e 493
2e575bcd 494C<documentation> is not supported since it's a very poor replacement for POD.
40f3e3aa 495
69673ca7 496Handling of warnings: when you C<use Moo> we enable FATAL warnings. The nearest
497similar invocation for L<Moose> would be:
498
499 use Moose;
500 use warnings FATAL => "all";
501
502Additionally, L<Moo> supports a set of attribute option shortcuts intended to
503reduce common boilerplate. The set of shortcuts is the same as in the L<Moose>
504module L<MooseX::AttributeShortcuts>. So if you:
505
506 package MyClass;
507 use Moo;
508
509The nearest L<Moose> invocation would be:
510
511 package MyClass;
512
513 use Moose;
514 use warnings FATAL => "all";
515 use MooseX::AttributeShortcuts;
516
5902c1fc 517or, if you're inheriting from a non-Moose class,
518
519 package MyClass;
520
521 use Moose;
522 use MooseX::NonMoose;
523 use warnings FATAL => "all";
524 use MooseX::AttributeShortcuts;
525
526Finally, Moose requires you to call
527
528 __PACKAGE__->meta->make_immutable;
529
530at the end of your class to get an inlined (i.e. not horribly slow)
531constructor. Moo does it automatically the first time ->new is called
532on your class.
533
40f3e3aa 534=head1 AUTHOR
535
536mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
537
538=head1 CONTRIBUTORS
539
5da684a2 540dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
541
542frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
543
544hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
545
546jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
547
548ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
40f3e3aa 549
11f7a042 550chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
551
a17be455 552ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
553
7b8177f8 554doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
555
1fb2de92 556perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
557
40f3e3aa 558=head1 COPYRIGHT
559
a958e36d 560Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
40f3e3aa 561as listed above.
562
563=head1 LICENSE
564
565This library is free software and may be distributed under the same terms
566as perl itself.
567
568=cut