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