document MX::AttributeShortcuts 009+ support
[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
1fce5bc9 194=head1 Moo and Moose - NEW, EXPERIMENTAL
195
196If L<Moo> detects L<Moose> being loaded, it will automatically register
197metaclasses for your L<Moo> and L<Moo::Role> packages, so you should be able
198to use them in L<Moose> code without it ever realising you aren't using
199L<Moose> everywhere.
200
201Extending a L<Moose> class or consuming a L<Moose::Role> should also work.
202
203However, these features are new as of 0.91.0 (0.091000) so they may not
204be 100% yet; please do report bugs.
205
206If you need to disable the metaclass creation, add:
207
208 no Moo::sification;
209
210to your code before Moose is loaded, but bear in mind that this switch is
211currently global and turns the mechanism off entirely, so don't put this
212in library code, only in a top level script as a temporary measure while
213you send a bug report.
214
8146585e 215=head1 IMPORTED METHODS
216
217=head2 new
218
219 Foo::Bar->new( attr1 => 3 );
220
221or
222
223 Foo::Bar->new({ attr1 => 3 });
224
2e575bcd 225=head2 BUILDARGS
226
f2eac33e 227 sub BUILDARGS {
a17be455 228 my ( $class, @args ) = @_;
229
230 unshift @args, "attr1" if @args % 2 == 1;
231
f2eac33e 232 return { @args };
a17be455 233 };
234
235 Foo::Bar->new( 3 );
236
237The default implementation of this method accepts a hash or hash reference of
238named parameters. If it receives a single argument that isn't a hash reference
239it throws an error.
240
241You can override this method in your class to handle other types of options
242passed to the constructor.
243
244This method should always return a hash reference of named options.
2e575bcd 245
2d00f3d6 246=head2 BUILD
8146585e 247
2d00f3d6 248Define a C<BUILD> method on your class and the constructor will automatically
249call the C<BUILD> method from parent down to child after the object has
250been instantiated. Typically this is used for object validation or possibly
251logging.
8146585e 252
2d00f3d6 253=head2 DEMOLISH
c2cc003f 254
debb3fcd 255If you have a C<DEMOLISH> method anywhere in your inheritance hierarchy,
256a C<DESTROY> method is created on first object construction which will call
c2cc003f 257C<< $instance->DEMOLISH($in_global_destruction) >> for each C<DEMOLISH>
debb3fcd 258method from child upwards to parents.
259
260Note that the C<DESTROY> method is created on first construction of an object
261of your class in order to not add overhead to classes without C<DEMOLISH>
262methods; this may prove slightly surprising if you try and define your own.
c2cc003f 263
8146585e 264=head2 does
265
266 if ($foo->does('Some::Role1')) {
267 ...
268 }
269
270Returns true if the object composes in the passed role.
271
272=head1 IMPORTED SUBROUTINES
273
274=head2 extends
275
276 extends 'Parent::Class';
277
2e575bcd 278Declares base class. Multiple superclasses can be passed for multiple
279inheritance (but please use roles instead).
280
281Calling extends more than once will REPLACE your superclasses, not add to
282them like 'use base' would.
8146585e 283
284=head2 with
285
286 with 'Some::Role1';
287 with 'Some::Role2';
288
289Composes a L<Role::Tiny> into current class. Only one role may be composed in
290at a time to allow the code to remain as simple as possible.
291
292=head2 has
293
294 has attr => (
295 is => 'ro',
296 );
297
298Declares an attribute for the class.
299
300The options for C<has> are as follows:
301
302=over 2
303
304=item * is
305
306B<required>, must be C<ro> or C<rw>. Unsurprisingly, C<ro> generates an
0654a8fa 307accessor that will not respond to arguments; to be clear: a getter only. C<rw>
8146585e 308will create a perlish getter/setter.
309
310=item * isa
311
312Takes a coderef which is meant to validate the attribute. Unlike L<Moose> Moo
313does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
314one should do
315
316 isa => quote_sub q{
317 die "$_[0] is not a number!" unless looks_like_number $_[0]
318 },
319
320L<Sub::Quote aware|/SUB QUOTE AWARE>
321
322=item * coerce
323
324Takes a coderef which is meant to coerce the attribute. The basic idea is to
325do something like the following:
326
327 coerce => quote_sub q{
328 $_[0] + 1 unless $_[0] % 2
329 },
330
23a3e34e 331Coerce does not require C<isa> to be defined.
8146585e 332
23a3e34e 333L<Sub::Quote aware|/SUB QUOTE AWARE>
2e575bcd 334
e1efec09 335=item * handles
336
337Takes a string
338
69673ca7 339 handles => 'RobotRole'
340
341Where C<RobotRole> is a role (L<Moo::Role>) that defines an interface which
342becomes the list of methods to handle.
e1efec09 343
344Takes a list of methods
345
346 handles => [ qw( one two ) ]
347
348Takes a hashref
349
350 handles => {
351 un => 'one',
352 }
353
8146585e 354=item * trigger
355
6fe5100d 356Takes a coderef which will get called any time the attribute is set. This
357includes the constructor. Coderef will be invoked against the object with the
358new value as an argument.
8146585e 359
2e575bcd 360Note that Moose also passes the old value, if any; this feature is not yet
361supported.
362
8146585e 363L<Sub::Quote aware|/SUB QUOTE AWARE>
364
365=item * default
366
2e575bcd 367Takes a coderef which will get called with $self as its only argument
368to populate an attribute if no value is supplied to the constructor - or
369if the attribute is lazy, when the attribute is first retrieved if no
370value has yet been provided.
371
372Note that if your default is fired during new() there is no guarantee that
373other attributes have been populated yet so you should not rely on their
374existence.
8146585e 375
376L<Sub::Quote aware|/SUB QUOTE AWARE>
377
378=item * predicate
379
2e575bcd 380Takes a method name which will return true if an attribute has a value.
8146585e 381
382A common example of this would be to call it C<has_$foo>, implying that the
383object has a C<$foo> set.
384
385=item * builder
386
2e575bcd 387Takes a method name which will be called to create the attribute - functions
388exactly like default except that instead of calling
389
390 $default->($self);
391
392Moo will call
393
394 $self->$builder;
8146585e 395
396=item * clearer
397
398Takes a method name which will clear the attribute.
399
400=item * lazy
401
402B<Boolean>. Set this if you want values for the attribute to be grabbed
403lazily. This is usually a good idea if you have a L</builder> which requires
404another attribute to be set.
405
406=item * required
407
408B<Boolean>. Set this if the attribute must be passed on instantiation.
409
1eba910c 410=item * reader
411
412The value of this attribute will be the name of the method to get the value of
413the attribute. If you like Java style methods, you might set this to
414C<get_foo>
415
416=item * writer
417
418The value of this attribute will be the name of the method to set the value of
419the attribute. If you like Java style methods, you might set this to
420C<set_foo>
421
8146585e 422=item * weak_ref
423
424B<Boolean>. Set this if you want the reference that the attribute contains to
425be weakened; use this when circular references are possible, which will cause
426leaks.
427
428=item * init_arg
429
430Takes the name of the key to look for at instantiation time of the object. A
431common use of this is to make an underscored attribute have a non-underscored
432initialization name. C<undef> means that passing the value in on instantiation
433
434=back
435
436=head2 before
437
438 before foo => sub { ... };
439
440See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
441documentation.
442
443=head2 around
444
445 around foo => sub { ... };
446
447See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
448documentation.
449
450=head2 after
451
452 after foo => sub { ... };
453
454See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
455documentation.
456
8146585e 457=head1 SUB QUOTE AWARE
458
459L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
460giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
461aware can take advantage of this.
462
2e575bcd 463=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 464
465You can only compose one role at a time. If your application is large or
5902c1fc 466complex enough to warrant complex composition, you wanted L<Moose>. Note that
467this does not mean you can only compose one role per class -
8146585e 468
5902c1fc 469 with 'FirstRole';
470 with 'SecondRole';
471
472is absolutely fine, there's just currently no equivalent of Moose's
473
474 with 'FirstRole', 'SecondRole';
475
476which composes the two roles together, and then applies them.
477
478There is no built in type system. C<isa> is verified with a coderef, if you
8146585e 479need complex types, just make a library of coderefs, or better yet, functions
5902c1fc 480that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
481to L<MooseX::Types::Moose> so that you can write
482
483 has days_to_live => (is => 'ro', isa => Int);
484
485and have it work with both; it is hoped that providing only subrefs as an
486API will encourage the use of other type systems as well, since it's
487probably the weakest part of Moose design-wise.
8146585e 488
2e575bcd 489C<initializer> is not supported in core since the author considers it to be a
f88623a1 490bad idea but may be supported by an extension in future. Meanwhile C<trigger> or
491C<coerce> are more likely to be able to fulfill your needs.
8146585e 492
493There is no meta object. If you need this level of complexity you wanted
2e575bcd 494L<Moose> - Moo succeeds at being small because it explicitly does not
495provide a metaprotocol.
8146585e 496
2e575bcd 497No support for C<super>, C<override>, C<inner>, or C<augment> - override can
498be handled by around albeit with a little more typing, and the author considers
499augment to be a bad idea.
8146585e 500
f2eac33e 501The C<dump> method is not provided by default. The author suggests loading
c96a6326 502L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
503using C<$obj-E<gt>$::Dwarn()> instead.
504
8146585e 505L</default> only supports coderefs, because doing otherwise is usually a
506mistake anyway.
507
508C<lazy_build> is not supported per se, but of course it will work if you
509manually set all the options it implies.
510
2e575bcd 511C<auto_deref> is not supported since the author considers it a bad idea.
8146585e 512
2e575bcd 513C<documentation> is not supported since it's a very poor replacement for POD.
40f3e3aa 514
69673ca7 515Handling of warnings: when you C<use Moo> we enable FATAL warnings. The nearest
516similar invocation for L<Moose> would be:
517
518 use Moose;
519 use warnings FATAL => "all";
520
521Additionally, L<Moo> supports a set of attribute option shortcuts intended to
522reduce common boilerplate. The set of shortcuts is the same as in the L<Moose>
239d4711 523module L<MooseX::AttributeShortcuts> as of its version 0.009+. So if you:
69673ca7 524
525 package MyClass;
526 use Moo;
527
528The nearest L<Moose> invocation would be:
529
530 package MyClass;
531
532 use Moose;
533 use warnings FATAL => "all";
534 use MooseX::AttributeShortcuts;
535
5902c1fc 536or, if you're inheriting from a non-Moose class,
537
538 package MyClass;
539
540 use Moose;
541 use MooseX::NonMoose;
542 use warnings FATAL => "all";
543 use MooseX::AttributeShortcuts;
544
545Finally, Moose requires you to call
546
547 __PACKAGE__->meta->make_immutable;
548
549at the end of your class to get an inlined (i.e. not horribly slow)
550constructor. Moo does it automatically the first time ->new is called
551on your class.
552
40f3e3aa 553=head1 AUTHOR
554
555mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
556
557=head1 CONTRIBUTORS
558
5da684a2 559dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
560
561frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
562
563hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
564
565jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
566
567ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
40f3e3aa 568
11f7a042 569chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
570
a17be455 571ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
572
7b8177f8 573doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
574
1fb2de92 575perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
576
40f3e3aa 577=head1 COPYRIGHT
578
a958e36d 579Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
40f3e3aa 580as listed above.
581
582=head1 LICENSE
583
584This library is free software and may be distributed under the same terms
585as perl itself.
586
587=cut