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