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