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