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