bcc4b71607f251ecd43c2280c060abd3f544bfaa
[gitmo/Moo.git] / lib / Moo.pm
1 package Moo;
2
3 use strictures 1;
4 use Moo::_Utils;
5 use B 'perlstring';
6 use Sub::Defer ();
7
8 our $VERSION = '1.002000'; # 1.2.0
9 $VERSION = eval $VERSION;
10
11 require Moo::sification;
12
13 our %MAKERS;
14
15 sub _install_tracked {
16   my ($target, $name, $code) = @_;
17   $MAKERS{$target}{exports}{$name} = $code;
18   _install_coderef "${target}::${name}" => "Moo::${name}" => $code;
19 }
20
21 sub import {
22   my $target = caller;
23   my $class = shift;
24   strictures->import;
25   if ($Moo::Role::INFO{$target} and $Moo::Role::INFO{$target}{is_role}) {
26     die "Cannot import Moo into a role";
27   }
28   $MAKERS{$target} ||= {};
29   _install_tracked $target => extends => sub {
30     $class->_set_superclasses($target, @_);
31     $class->_maybe_reset_handlemoose($target);
32     return;
33   };
34   _install_tracked $target => with => sub {
35     require Moo::Role;
36     Moo::Role->apply_roles_to_package($target, @_);
37     $class->_maybe_reset_handlemoose($target);
38   };
39   _install_tracked $target => has => sub {
40     my ($name_proto, %spec) = @_;
41     my $name_isref = ref $name_proto eq 'ARRAY';
42     foreach my $name ($name_isref ? @$name_proto : $name_proto) {
43       # Note that when $name_proto is an arrayref, each attribute
44       # needs a separate \%specs hashref
45       my $spec_ref = $name_isref ? +{%spec} : \%spec;
46       $class->_constructor_maker_for($target)
47             ->register_attribute_specs($name, $spec_ref);
48       $class->_accessor_maker_for($target)
49             ->generate_method($target, $name, $spec_ref);
50       $class->_maybe_reset_handlemoose($target);
51     }
52     return;
53   };
54   foreach my $type (qw(before after around)) {
55     _install_tracked $target => $type => sub {
56       require Class::Method::Modifiers;
57       _install_modifier($target, $type, @_);
58       return;
59     };
60   }
61   return if $MAKERS{$target}{is_class}; # already exported into this package
62   $MAKERS{$target}{is_class} = 1;
63   {
64     no strict 'refs';
65     @{"${target}::ISA"} = do {
66       require Moo::Object; ('Moo::Object');
67     } unless @{"${target}::ISA"};
68   }
69   if ($INC{'Moo/HandleMoose.pm'}) {
70     Moo::HandleMoose::inject_fake_metaclass_for($target);
71   }
72 }
73
74 sub unimport {
75   my $target = caller;
76   _unimport_coderefs($target, $MAKERS{$target});
77 }
78
79 sub _set_superclasses {
80   my $class = shift;
81   my $target = shift;
82   foreach my $superclass (@_) {
83     _load_module($superclass);
84     if ($INC{"Role/Tiny.pm"} && $Role::Tiny::INFO{$superclass}) {
85       require Carp;
86       Carp::croak("Can't extend role '$superclass'");
87     }
88   }
89   # Can't do *{...} = \@_ or 5.10.0's mro.pm stops seeing @ISA
90   @{*{_getglob("${target}::ISA")}{ARRAY}} = @_;
91   if (my $old = delete $Moo::MAKERS{$target}{constructor}) {
92     delete _getstash($target)->{new};
93     Moo->_constructor_maker_for($target)
94        ->register_attribute_specs(%{$old->all_attribute_specs});
95   }
96   elsif (!$target->isa('Moo::Object')) {
97     Moo->_constructor_maker_for($target);
98   }
99   no warnings 'once'; # piss off. -- mst
100   $Moo::HandleMoose::MOUSE{$target} = [
101     grep defined, map Mouse::Util::find_meta($_), @_
102   ] if Mouse::Util->can('find_meta');
103 }
104
105 sub _maybe_reset_handlemoose {
106   my ($class, $target) = @_;
107   if ($INC{"Moo/HandleMoose.pm"}) {
108     Moo::HandleMoose::maybe_reinject_fake_metaclass_for($target);
109   }
110 }
111
112 sub _accessor_maker_for {
113   my ($class, $target) = @_;
114   return unless $MAKERS{$target};
115   $MAKERS{$target}{accessor} ||= do {
116     my $maker_class = do {
117       if (my $m = do {
118             if (my $defer_target = 
119                   (Sub::Defer::defer_info($target->can('new'))||[])->[0]
120               ) {
121               my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
122               $MAKERS{$pkg} && $MAKERS{$pkg}{accessor};
123             } else {
124               undef;
125             }
126           }) {
127         ref($m);
128       } else {
129         require Method::Generate::Accessor;
130         'Method::Generate::Accessor'
131       }
132     };
133     $maker_class->new;
134   }
135 }
136
137 sub _constructor_maker_for {
138   my ($class, $target) = @_;
139   return unless $MAKERS{$target};
140   $MAKERS{$target}{constructor} ||= do {
141     require Method::Generate::Constructor;
142     require Sub::Defer;
143     my ($moo_constructor, $con);
144
145     my $t_new = $target->can('new');
146     if ($t_new) {
147       if ($t_new == Moo::Object->can('new')) {
148         $moo_constructor = 1;
149       } elsif (my $defer_target = (Sub::Defer::defer_info($t_new)||[])->[0]) {
150         my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
151         if ($MAKERS{$pkg}) {
152           $moo_constructor = 1;
153           $con = $MAKERS{$pkg}{constructor};
154         }
155       }
156     } else {
157       $moo_constructor = 1; # no other constructor, make a Moo one
158     }
159     ($con ? ref($con) : 'Method::Generate::Constructor')
160       ->new(
161         package => $target,
162         accessor_generator => $class->_accessor_maker_for($target),
163         construction_string => (
164           $moo_constructor
165             ? ($con ? $con->construction_string : undef)
166             : ('$class->'.$target.'::SUPER::new($class->can(q[FOREIGNBUILDARGS]) ? $class->FOREIGNBUILDARGS(@_) : @_)')
167         ),
168         subconstructor_handler => (
169           '      if ($Moo::MAKERS{$class}) {'."\n"
170           .'        '.$class.'->_constructor_maker_for($class,'.perlstring($target).');'."\n"
171           .'        return $class->new(@_)'.";\n"
172           .'      } elsif ($INC{"Moose.pm"} and my $meta = Class::MOP::get_metaclass_by_name($class)) {'."\n"
173           .'        return $meta->new_object($class->BUILDARGS(@_));'."\n"
174           .'      }'."\n"
175         ),
176       )
177       ->install_delayed
178       ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}})
179   }
180 }
181
182 1;
183 =pod
184
185 =encoding utf-8
186
187 =head1 NAME
188
189 Moo - Minimalist Object Orientation (with Moose compatibility)
190
191 =head1 SYNOPSIS
192
193  package Cat::Food;
194
195  use Moo;
196
197  sub feed_lion {
198    my $self = shift;
199    my $amount = shift || 1;
200
201    $self->pounds( $self->pounds - $amount );
202  }
203
204  has taste => (
205    is => 'ro',
206  );
207
208  has brand => (
209    is  => 'ro',
210    isa => sub {
211      die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
212    },
213  );
214
215  has pounds => (
216    is  => 'rw',
217    isa => sub { die "$_[0] is too much cat food!" unless $_[0] < 15 },
218  );
219
220  1;
221
222 And elsewhere:
223
224  my $full = Cat::Food->new(
225     taste  => 'DELICIOUS.',
226     brand  => 'SWEET-TREATZ',
227     pounds => 10,
228  );
229
230  $full->feed_lion;
231
232  say $full->pounds;
233
234 =head1 DESCRIPTION
235
236 This module is an extremely light-weight subset of L<Moose> optimised for
237 rapid startup and "pay only for what you use".
238
239 It also avoids depending on any XS modules to allow simple deployments.  The
240 name C<Moo> is based on the idea that it provides almost -- but not quite -- two
241 thirds of L<Moose>.
242
243 Unlike L<Mouse> this module does not aim at full compatibility with
244 L<Moose>'s surface syntax, preferring instead of provide full interoperability
245 via the metaclass inflation capabilities described in L</MOO AND MOOSE>.
246
247 For a full list of the minor differences between L<Moose> and L<Moo>'s surface
248 syntax, see L</INCOMPATIBILITIES WITH MOOSE>.
249
250 =head1 WHY MOO EXISTS
251
252 If you want a full object system with a rich Metaprotocol, L<Moose> is
253 already wonderful.
254
255 However, sometimes you're writing a command line script or a CGI script
256 where fast startup is essential, or code designed to be deployed as a single
257 file via L<App::FatPacker>, or you're writing a CPAN module and you want it
258 to be usable by people with those constraints.
259
260 I've tried several times to use L<Mouse> but it's 3x the size of Moo and
261 takes longer to load than most of my Moo based CGI scripts take to run.
262
263 If you don't want L<Moose>, you don't want "less metaprotocol" like L<Mouse>,
264 you want "as little as possible" -- which means "no metaprotocol", which is
265 what Moo provides.
266
267 Better still, if you install and load L<Moose>, we set up metaclasses for your
268 L<Moo> classes and L<Moo::Role> roles, so you can use them in L<Moose> code
269 without ever noticing that some of your codebase is using L<Moo>.
270
271 Hence, Moo exists as its name -- Minimal Object Orientation -- with a pledge
272 to make it smooth to upgrade to L<Moose> when you need more than minimal
273 features.
274
275 =head1 MOO AND MOOSE
276
277 If L<Moo> detects L<Moose> being loaded, it will automatically register
278 metaclasses for your L<Moo> and L<Moo::Role> packages, so you should be able
279 to use them in L<Moose> code without anybody ever noticing you aren't using
280 L<Moose> everywhere.
281
282 L<Moo> will also create L<Moose type constraints|Moose::Manual::Types> for
283 classes and roles, so that C<< isa => 'MyClass' >> and C<< isa => 'MyRole' >>
284 work the same as for L<Moose> classes and roles.
285
286 Extending a L<Moose> class or consuming a L<Moose::Role> will also work.
287
288 So will extending a L<Mouse> class or consuming a L<Mouse::Role> - but note
289 that we don't provide L<Mouse> metaclasses or metaroles so the other way
290 around doesn't work. This feature exists for L<Any::Moose> users porting to
291 L<Moo>; enabling L<Mouse> users to use L<Moo> classes is not a priority for us.
292
293 This means that there is no need for anything like L<Any::Moose> for Moo
294 code - Moo and Moose code should simply interoperate without problem. To
295 handle L<Mouse> code, you'll likely need an empty Moo role or class consuming
296 or extending the L<Mouse> stuff since it doesn't register true L<Moose>
297 metaclasses like L<Moo> does.
298
299 If you want types to be upgraded to the L<Moose> types, use
300 L<MooX::Types::MooseLike> and install the L<MooseX::Types> library to
301 match the L<MooX::Types::MooseLike> library you're using - L<Moo> will
302 load the L<MooseX::Types> library and use that type for the newly created
303 metaclass.
304
305 If you need to disable the metaclass creation, add:
306
307   no Moo::sification;
308
309 to your code before Moose is loaded, but bear in mind that this switch is
310 currently global and turns the mechanism off entirely so don't put this
311 in library code.
312
313 =head1 MOO VERSUS ANY::MOOSE
314
315 L<Any::Moose> will load L<Mouse> normally, and L<Moose> in a program using
316 L<Moose> - which theoretically allows you to get the startup time of L<Mouse>
317 without disadvantaging L<Moose> users.
318
319 Sadly, this doesn't entirely work, since the selection is load order dependent
320 - L<Moo>'s metaclass inflation system explained above in L</MOO AND MOOSE> is
321 significantly more reliable.
322
323 So if you want to write a CPAN module that loads fast or has only pure perl
324 dependencies but is also fully usable by L<Moose> users, you should be using
325 L<Moo>.
326
327 For a full explanation, see the article
328 L<http://shadow.cat/blog/matt-s-trout/moo-versus-any-moose> which explains
329 the differing strategies in more detail and provides a direct example of
330 where L<Moo> succeeds and L<Any::Moose> fails.
331
332 =head1 IMPORTED METHODS
333
334 =head2 new
335
336  Foo::Bar->new( attr1 => 3 );
337
338 or
339
340  Foo::Bar->new({ attr1 => 3 });
341
342 =head2 BUILDARGS
343
344  sub BUILDARGS {
345    my ( $class, @args ) = @_;
346
347    unshift @args, "attr1" if @args % 2 == 1;
348
349    return { @args };
350  };
351
352  Foo::Bar->new( 3 );
353
354 The default implementation of this method accepts a hash or hash reference of
355 named parameters. If it receives a single argument that isn't a hash reference
356 it throws an error.
357
358 You can override this method in your class to handle other types of options
359 passed to the constructor.
360
361 This method should always return a hash reference of named options.
362
363 =head2 FOREIGNBUILDARGS
364
365 If you are inheriting from a non-Moo class, the arguments passed to the parent
366 class constructor can be manipulated by defining a C<FOREIGNBUILDARGS> method.
367 It will receive the same arguments as C<BUILDARGS>, and should return a list
368 of arguments to pass to the parent class constructor.
369
370 =head2 BUILD
371
372 Define a C<BUILD> method on your class and the constructor will automatically
373 call the C<BUILD> method from parent down to child after the object has
374 been instantiated.  Typically this is used for object validation or possibly
375 logging.
376
377 =head2 DEMOLISH
378
379 If you have a C<DEMOLISH> method anywhere in your inheritance hierarchy,
380 a C<DESTROY> method is created on first object construction which will call
381 C<< $instance->DEMOLISH($in_global_destruction) >> for each C<DEMOLISH>
382 method from child upwards to parents.
383
384 Note that the C<DESTROY> method is created on first construction of an object
385 of your class in order to not add overhead to classes without C<DEMOLISH>
386 methods; this may prove slightly surprising if you try and define your own.
387
388 =head2 does
389
390  if ($foo->does('Some::Role1')) {
391    ...
392  }
393
394 Returns true if the object composes in the passed role.
395
396 =head1 IMPORTED SUBROUTINES
397
398 =head2 extends
399
400  extends 'Parent::Class';
401
402 Declares base class. Multiple superclasses can be passed for multiple
403 inheritance (but please use roles instead).
404
405 Calling extends more than once will REPLACE your superclasses, not add to
406 them like 'use base' would.
407
408 =head2 with
409
410  with 'Some::Role1';
411
412 or
413
414  with 'Some::Role1', 'Some::Role2';
415
416 Composes one or more L<Moo::Role> (or L<Role::Tiny>) roles into the current
417 class.  An error will be raised if these roles have conflicting methods.
418
419 =head2 has
420
421  has attr => (
422    is => 'ro',
423  );
424
425 Declares an attribute for the class.
426
427  package Foo;
428  use Moo;
429  has 'attr' => (
430    is => 'ro'
431  );
432
433  package Bar;
434  use Moo;
435  extends 'Foo';
436  has '+attr' => (
437    default => sub { "blah" },
438  );
439
440 Using the C<+> notation, it's possible to override an attribute.
441
442 The options for C<has> are as follows:
443
444 =over 2
445
446 =item * is
447
448 B<required>, may be C<ro>, C<lazy>, C<rwp> or C<rw>.
449
450 C<ro> generates an accessor that dies if you attempt to write to it - i.e.
451 a getter only - by defaulting C<reader> to the name of the attribute.
452
453 C<lazy> generates a reader like C<ro>, but also sets C<lazy> to 1 and
454 C<builder> to C<_build_${attribute_name}> to allow on-demand generated
455 attributes.  This feature was my attempt to fix my incompetence when
456 originally designing C<lazy_build>, and is also implemented by
457 L<MooseX::AttributeShortcuts>. There is, however, nothing to stop you
458 using C<lazy> and C<builder> yourself with C<rwp> or C<rw> - it's just that
459 this isn't generally a good idea so we don't provide a shortcut for it.
460
461 C<rwp> generates a reader like C<ro>, but also sets C<writer> to
462 C<_set_${attribute_name}> for attributes that are designed to be written
463 from inside of the class, but read-only from outside.
464 This feature comes from L<MooseX::AttributeShortcuts>.
465
466 C<rw> generates a normal getter/setter by defaulting C<accessor> to the
467 name of the attribute.
468
469 =item * isa
470
471 Takes a coderef which is meant to validate the attribute.  Unlike L<Moose>, Moo
472 does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
473 one should do
474
475  isa => sub {
476    die "$_[0] is not a number!" unless looks_like_number $_[0]
477  },
478
479 Note that the return value is ignored, only whether the sub lives or
480 dies matters.
481
482 L<Sub::Quote aware|/SUB QUOTE AWARE>
483
484 Since L<Moo> does B<not> run the C<isa> check before C<coerce> if a coercion
485 subroutine has been supplied, C<isa> checks are not structural to your code
486 and can, if desired, be omitted on non-debug builds (although if this results
487 in an uncaught bug causing your program to break, the L<Moo> authors guarantee
488 nothing except that you get to keep both halves).
489
490 If you want L<MooseX::Types> style named types, look at
491 L<MooX::Types::MooseLike>.
492
493 To cause your C<isa> entries to be automatically mapped to named
494 L<Moose::Meta::TypeConstraint> objects (rather than the default behaviour
495 of creating an anonymous type), set:
496
497   $Moo::HandleMoose::TYPE_MAP{$isa_coderef} = sub {
498     require MooseX::Types::Something;
499     return MooseX::Types::Something::TypeName();
500   };
501
502 Note that this example is purely illustrative; anything that returns a
503 L<Moose::Meta::TypeConstraint> object or something similar enough to it to
504 make L<Moose> happy is fine.
505
506 =item * coerce
507
508 Takes a coderef which is meant to coerce the attribute.  The basic idea is to
509 do something like the following:
510
511  coerce => sub {
512    $_[0] + 1 unless $_[0] % 2
513  },
514
515 Note that L<Moo> will always fire your coercion: this is to permit
516 C<isa> entries to be used purely for bug trapping, whereas coercions are
517 always structural to your code. We do, however, apply any supplied C<isa>
518 check after the coercion has run to ensure that it returned a valid value.
519
520 L<Sub::Quote aware|/SUB QUOTE AWARE>
521
522 =item * handles
523
524 Takes a string
525
526   handles => 'RobotRole'
527
528 Where C<RobotRole> is a role (L<Moo::Role>) that defines an interface which
529 becomes the list of methods to handle.
530
531 Takes a list of methods
532
533  handles => [ qw( one two ) ]
534
535 Takes a hashref
536
537  handles => {
538    un => 'one',
539  }
540
541 =item * C<trigger>
542
543 Takes a coderef which will get called any time the attribute is set. This
544 includes the constructor, but not default or built values. Coderef will be
545 invoked against the object with the new value as an argument.
546
547 If you set this to just C<1>, it generates a trigger which calls the
548 C<_trigger_${attr_name}> method on C<$self>. This feature comes from
549 L<MooseX::AttributeShortcuts>.
550
551 Note that Moose also passes the old value, if any; this feature is not yet
552 supported.
553
554 L<Sub::Quote aware|/SUB QUOTE AWARE>
555
556 =item * C<default>
557
558 Takes a coderef which will get called with $self as its only argument
559 to populate an attribute if no value is supplied to the constructor - or
560 if the attribute is lazy, when the attribute is first retrieved if no
561 value has yet been provided.
562
563 If a simple scalar is provided, it will be inlined as a string. Any non-code
564 reference (hash, array) will result in an error - for that case instead use
565 a code reference that returns the desired value.
566
567 Note that if your default is fired during new() there is no guarantee that
568 other attributes have been populated yet so you should not rely on their
569 existence.
570
571 L<Sub::Quote aware|/SUB QUOTE AWARE>
572
573 =item * C<predicate>
574
575 Takes a method name which will return true if an attribute has a value.
576
577 If you set this to just C<1>, the predicate is automatically named
578 C<has_${attr_name}> if your attribute's name does not start with an
579 underscore, or C<_has_${attr_name_without_the_underscore}> if it does.
580 This feature comes from L<MooseX::AttributeShortcuts>.
581
582 =item * C<builder>
583
584 Takes a method name which will be called to create the attribute - functions
585 exactly like default except that instead of calling
586
587   $default->($self);
588
589 Moo will call
590
591   $self->$builder;
592
593 The following features come from L<MooseX::AttributeShortcuts>:
594
595 If you set this to just C<1>, the builder is automatically named
596 C<_build_${attr_name}>.
597
598 If you set this to a coderef or code-convertible object, that variable will be
599 installed under C<$class::_build_${attr_name}> and the builder set to the same
600 name.
601
602 =item * C<clearer>
603
604 Takes a method name which will clear the attribute.
605
606 If you set this to just C<1>, the clearer is automatically named
607 C<clear_${attr_name}> if your attribute's name does not start with an
608 underscore, or <_clear_${attr_name_without_the_underscore}> if it does.
609 This feature comes from L<MooseX::AttributeShortcuts>.
610
611 =item * C<lazy>
612
613 B<Boolean>.  Set this if you want values for the attribute to be grabbed
614 lazily.  This is usually a good idea if you have a L</builder> which requires
615 another attribute to be set.
616
617 =item * C<required>
618
619 B<Boolean>.  Set this if the attribute must be passed on instantiation.
620
621 =item * C<reader>
622
623 The value of this attribute will be the name of the method to get the value of
624 the attribute.  If you like Java style methods, you might set this to
625 C<get_foo>
626
627 =item * C<writer>
628
629 The value of this attribute will be the name of the method to set the value of
630 the attribute.  If you like Java style methods, you might set this to
631 C<set_foo>.
632
633 =item * C<weak_ref>
634
635 B<Boolean>.  Set this if you want the reference that the attribute contains to
636 be weakened; use this when circular references are possible, which will cause
637 leaks.
638
639 =item * C<init_arg>
640
641 Takes the name of the key to look for at instantiation time of the object.  A
642 common use of this is to make an underscored attribute have a non-underscored
643 initialization name. C<undef> means that passing the value in on instantiation
644 is ignored.
645
646 =item * C<moosify>
647
648 Takes either a coderef or array of coderefs which is meant to transform the
649 given attributes specifications if necessary when upgrading to a Moose role or
650 class. You shouldn't need this by default, but is provided as a means of
651 possible extensibility.
652
653 =back
654
655 =head2 before
656
657  before foo => sub { ... };
658
659 See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
660 documentation.
661
662 =head2 around
663
664  around foo => sub { ... };
665
666 See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
667 documentation.
668
669 =head2 after
670
671  after foo => sub { ... };
672
673 See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
674 documentation.
675
676 =head1 SUB QUOTE AWARE
677
678 L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
679 giving us a handy, XS-free speed boost.  Any option that is L<Sub::Quote>
680 aware can take advantage of this.
681
682 To do this, you can write
683
684   use Moo;
685   use Sub::Quote;
686
687   has foo => (
688     is => 'ro',
689     isa => quote_sub(q{ die "Not <3" unless $_[0] < 3 })
690   );
691
692 which will be inlined as
693
694   do {
695     local @_ = ($_[0]->{foo});
696     die "Not <3" unless $_[0] < 3;
697   }
698
699 or to avoid localizing @_,
700
701   has foo => (
702     is => 'ro',
703     isa => quote_sub(q{ my ($val) = @_; die "Not <3" unless $val < 3 })
704   );
705
706 which will be inlined as
707
708   do {
709     my ($val) = ($_[0]->{foo});
710     die "Not <3" unless $val < 3;
711   }
712
713 See L<Sub::Quote> for more information, including how to pass lexical
714 captures that will also be compiled into the subroutine.
715
716 =head1 INCOMPATIBILITIES WITH MOOSE
717
718 There is no built-in type system.  C<isa> is verified with a coderef; if you
719 need complex types, just make a library of coderefs, or better yet, functions
720 that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
721 to L<MooseX::Types::Moose> so that you can write
722
723   has days_to_live => (is => 'ro', isa => Int);
724
725 and have it work with both; it is hoped that providing only subrefs as an
726 API will encourage the use of other type systems as well, since it's
727 probably the weakest part of Moose design-wise.
728
729 C<initializer> is not supported in core since the author considers it to be a
730 bad idea and Moose best practices recommend avoiding it. Meanwhile C<trigger> or
731 C<coerce> are more likely to be able to fulfill your needs.
732
733 There is no meta object.  If you need this level of complexity you wanted
734 L<Moose> - Moo succeeds at being small because it explicitly does not
735 provide a metaprotocol. However, if you load L<Moose>, then
736
737   Class::MOP::class_of($moo_class_or_role)
738
739 will return an appropriate metaclass pre-populated by L<Moo>.
740
741 No support for C<super>, C<override>, C<inner>, or C<augment> - the author
742 considers augment to be a bad idea, and override can be translated:
743
744   override foo => sub {
745     ...
746     super();
747     ...
748   };
749
750   around foo => sub {
751     my ($orig, $self) = (shift, shift);
752     ...
753     $self->$orig(@_);
754     ...
755   };
756
757 The C<dump> method is not provided by default. The author suggests loading
758 L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
759 using C<$obj-E<gt>$::Dwarn()> instead.
760
761 L</default> only supports coderefs and plain scalars, because passing a hash
762 or array reference as a default is almost always incorrect since the value is
763 then shared between all objects using that default.
764
765 C<lazy_build> is not supported; you are instead encouraged to use the
766 C<< is => 'lazy' >> option supported by L<Moo> and L<MooseX::AttributeShortcuts>.
767
768 C<auto_deref> is not supported since the author considers it a bad idea and
769 it has been considered best practice to avoid it for some time.
770
771 C<documentation> will show up in a L<Moose> metaclass created from your class
772 but is otherwise ignored. Then again, L<Moose> ignores it as well, so this
773 is arguably not an incompatibility.
774
775 Since C<coerce> does not require C<isa> to be defined but L<Moose> does
776 require it, the metaclass inflation for coerce alone is a trifle insane
777 and if you attempt to subtype the result will almost certainly break.
778
779 Handling of warnings: when you C<use Moo> we enable FATAL warnings.  The nearest
780 similar invocation for L<Moose> would be:
781
782   use Moose;
783   use warnings FATAL => "all";
784
785 Additionally, L<Moo> supports a set of attribute option shortcuts intended to
786 reduce common boilerplate.  The set of shortcuts is the same as in the L<Moose>
787 module L<MooseX::AttributeShortcuts> as of its version 0.009+.  So if you:
788
789     package MyClass;
790     use Moo;
791
792 The nearest L<Moose> invocation would be:
793
794     package MyClass;
795
796     use Moose;
797     use warnings FATAL => "all";
798     use MooseX::AttributeShortcuts;
799
800 or, if you're inheriting from a non-Moose class,
801
802     package MyClass;
803
804     use Moose;
805     use MooseX::NonMoose;
806     use warnings FATAL => "all";
807     use MooseX::AttributeShortcuts;
808
809 Finally, Moose requires you to call
810
811     __PACKAGE__->meta->make_immutable;
812
813 at the end of your class to get an inlined (i.e. not horribly slow)
814 constructor. Moo does it automatically the first time ->new is called
815 on your class. (C<make_immutable> is a no-op in Moo to ease migration.)
816
817 An extension L<MooX::late> exists to ease translating Moose packages
818 to Moo by providing a more Moose-like interface.
819
820 =head1 SUPPORT
821
822 Users' IRC: #moose on irc.perl.org
823
824 =for html <a href="http://chat.mibbit.com/#moose@irc.perl.org">(click for instant chatroom login)</a>
825
826 Development and contribution IRC: #web-simple on irc.perl.org
827
828 =for html <a href="http://chat.mibbit.com/#web-simple@irc.perl.org">(click for instant chatroom login)</a>
829
830 Bugtracker: L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Moo>
831
832 Git repository: L<git://git.shadowcat.co.uk/gitmo/Moo.git>
833
834 Git web access: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Moo.git>
835
836 =head1 AUTHOR
837
838 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
839
840 =head1 CONTRIBUTORS
841
842 dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
843
844 frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
845
846 hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
847
848 jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
849
850 ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
851
852 chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
853
854 ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
855
856 doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
857
858 perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
859
860 Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
861
862 ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
863
864 tobyink - Toby Inkster (cpan:TOBYINK) <tobyink@cpan.org>
865
866 haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
867
868 mattp - Matt Phillips (cpan:MATTP) <mattp@cpan.org>
869
870 =head1 COPYRIGHT
871
872 Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
873 as listed above.
874
875 =head1 LICENSE
876
877 This library is free software and may be distributed under the same terms
878 as perl itself. See L<http://dev.perl.org/licenses/>.
879
880 =cut