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