1NAME
2 Moo - Minimalist Object Orientation (with Moose compatibility)
3
4SYNOPSIS
5 package Cat::Food;
6
7 use Moo;
8 use strictures 2;
9 use namespace::clean;
10
11 sub feed_lion {
12 my $self = shift;
13 my $amount = shift || 1;
14
15 $self->pounds( $self->pounds - $amount );
16 }
17
18 has taste => (
19 is => 'ro',
20 );
21
22 has brand => (
23 is => 'ro',
24 isa => sub {
25 die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
26 },
27 );
28
29 has pounds => (
30 is => 'rw',
31 isa => sub { die "$_[0] is too much cat food!" unless $_[0] < 15 },
32 );
33
34 1;
35
36 And elsewhere:
37
38 my $full = Cat::Food->new(
39 taste => 'DELICIOUS.',
40 brand => 'SWEET-TREATZ',
41 pounds => 10,
42 );
43
44 $full->feed_lion;
45
46 say $full->pounds;
47
48DESCRIPTION
49 "Moo" is an extremely light-weight Object Orientation system. It allows
50 one to concisely define objects and roles with a convenient syntax that
51 avoids the details of Perl's object system. "Moo" contains a subset of
52 Moose and is optimised for rapid startup.
53
54 "Moo" avoids depending on any XS modules to allow for simple
55 deployments. The name "Moo" is based on the idea that it provides almost
56 -- but not quite -- two thirds of Moose. As such, the Moose::Manual can
57 serve as an effective guide to "Moo" aside from the MOP and Types
58 sections.
59
60 Unlike Mouse this module does not aim at full compatibility with Moose's
61 surface syntax, preferring instead to provide full interoperability via
62 the metaclass inflation capabilities described in "MOO AND MOOSE".
63
64 For a full list of the minor differences between Moose and Moo's surface
65 syntax, see "INCOMPATIBILITIES WITH MOOSE".
66
67WHY MOO EXISTS
68 If you want a full object system with a rich Metaprotocol, Moose is
69 already wonderful.
70
71 But if you don't want to use Moose, you may not want "less metaprotocol"
72 like Mouse offers, but you probably want "no metaprotocol", which is
73 what Moo provides. "Moo" is ideal for some situations where deployment
74 or startup time precludes using Moose and Mouse:
75
76 a command line or CGI script where fast startup is essential
77 code designed to be deployed as a single file via App::FatPacker
78 a CPAN module that may be used by others in the above situations
79
80 "Moo" maintains transparent compatibility with Moose so if you install
81 and load Moose you can use Moo classes and roles in Moose code without
82 modification.
83
84 Moo -- Minimal Object Orientation -- aims to make it smooth to upgrade
85 to Moose when you need more than the minimal features offered by Moo.
86
87MOO AND MOOSE
88 If Moo detects Moose being loaded, it will automatically register
89 metaclasses for your Moo and Moo::Role packages, so you should be able
90 to use them in Moose code without modification.
91
92 Moo will also create Moose type constraints for Moo classes and roles,
93 so that in Moose classes "isa => 'MyMooClass'" and "isa => 'MyMooRole'"
94 work the same as for Moose classes and roles.
95
96 Extending a Moose class or consuming a Moose::Role will also work.
97
98 Extending a Mouse class or consuming a Mouse::Role will also work. But
99 note that we don't provide Mouse metaclasses or metaroles so the other
100 way around doesn't work. This feature exists for Any::Moose users
101 porting to Moo; enabling Mouse users to use Moo classes is not a
102 priority for us.
103
104 This means that there is no need for anything like Any::Moose for Moo
105 code - Moo and Moose code should simply interoperate without problem. To
106 handle Mouse code, you'll likely need an empty Moo role or class
107 consuming or extending the Mouse stuff since it doesn't register true
108 Moose metaclasses like Moo does.
109
110 If you need to disable the metaclass creation, add:
111
112 no Moo::sification;
113
114 to your code before Moose is loaded, but bear in mind that this switch
115 is global and turns the mechanism off entirely so don't put this in
116 library code.
117
118MOO AND CLASS::XSACCESSOR
119 If a new enough version of Class::XSAccessor is available, it will be
120 used to generate simple accessors, readers, and writers for better
121 performance. Simple accessors are those without lazy defaults, type
122 checks/coercions, or triggers. Simple readers are those without lazy
123 defaults. Readers and writers generated by Class::XSAccessor will behave
124 slightly differently: they will reject attempts to call them with the
125 incorrect number of parameters.
126
127MOO VERSUS ANY::MOOSE
128 Any::Moose will load Mouse normally, and Moose in a program using Moose
129 - which theoretically allows you to get the startup time of Mouse
130 without disadvantaging Moose users.
131
132 Sadly, this doesn't entirely work, since the selection is load order
133 dependent - Moo's metaclass inflation system explained above in "MOO AND
134 MOOSE" is significantly more reliable.
135
136 So if you want to write a CPAN module that loads fast or has only pure
137 perl dependencies but is also fully usable by Moose users, you should be
138 using Moo.
139
140 For a full explanation, see the article
141 <https://shadow.cat/blog/matt-s-trout/moo-versus-any-moose> which
142 explains the differing strategies in more detail and provides a direct
143 example of where Moo succeeds and Any::Moose fails.
144
145PUBLIC METHODS
146 Moo provides several methods to any class using it.
147
148 new
149 Foo::Bar->new( attr1 => 3 );
150
151 or
152
153 Foo::Bar->new({ attr1 => 3 });
154
155 The constructor for the class. By default it will accept attributes
156 either as a hashref, or a list of key value pairs. This can be
157 customized with the "BUILDARGS" method.
158
159 does
160 if ($foo->does('Some::Role1')) {
161 ...
162 }
163
164 Returns true if the object composes in the passed role.
165
166 DOES
167 if ($foo->DOES('Some::Role1') || $foo->DOES('Some::Class1')) {
168 ...
169 }
170
171 Similar to "does", but will also return true for both composed roles and
172 superclasses.
173
174 meta
175 my $meta = Foo::Bar->meta;
176 my @methods = $meta->get_method_list;
177
178 Returns an object that will behave as if it is a Moose metaclass object
179 for the class. If you call anything other than "make_immutable" on it,
180 the object will be transparently upgraded to a genuine
181 Moose::Meta::Class instance, loading Moose in the process if required.
182 "make_immutable" itself is a no-op, since we generate metaclasses that
183 are already immutable, and users converting from Moose had an
184 unfortunate tendency to accidentally load Moose by calling it.
185
186LIFECYCLE METHODS
187 There are several methods that you can define in your class to control
188 construction and destruction of objects. They should be used rather than
189 trying to modify "new" or "DESTROY" yourself.
190
191 BUILDARGS
192 around BUILDARGS => sub {
193 my ( $orig, $class, @args ) = @_;
194
195 return { attr1 => $args[0] }
196 if @args == 1 && !ref $args[0];
197
198 return $class->$orig(@args);
199 };
200
201 Foo::Bar->new( 3 );
202
203 This class method is used to transform the arguments to "new" into a
204 hash reference of attribute values.
205
206 The default implementation accepts a hash or hash reference of named
207 parameters. If it receives a single argument that isn't a hash reference
208 it will throw an error.
209
210 You can override this method in your class to handle other types of
211 options passed to the constructor.
212
213 This method should always return a hash reference of named options.
214
215 FOREIGNBUILDARGS
216 sub FOREIGNBUILDARGS {
217 my ( $class, $options ) = @_;
218 return $options->{foo};
219 }
220
221 If you are inheriting from a non-Moo class, the arguments passed to the
222 parent class constructor can be manipulated by defining a
223 "FOREIGNBUILDARGS" method. It will receive the same arguments as
224 "BUILDARGS", and should return a list of arguments to pass to the parent
225 class constructor.
226
227 BUILD
228 sub BUILD {
229 my ($self, $args) = @_;
230 die "foo and bar cannot be used at the same time"
231 if exists $args->{foo} && exists $args->{bar};
232 }
233
234 On object creation, any "BUILD" methods in the class's inheritance
235 hierarchy will be called on the object and given the results of
236 "BUILDARGS". They each will be called in order from the parent classes
237 down to the child, and thus should not themselves call the parent's
238 method. Typically this is used for object validation or possibly
239 logging.
240
241 DEMOLISH
242 sub DEMOLISH {
243 my ($self, $in_global_destruction) = @_;
244 ...
245 }
246
247 When an object is destroyed, any "DEMOLISH" methods in the inheritance
248 hierarchy will be called on the object. They are given boolean to inform
249 them if global destruction is in progress, and are called from the child
250 class upwards to the parent. This is similar to "BUILD" methods but in
251 the opposite order.
252
253 Note that this is implemented by a "DESTROY" method, which is only
254 created on on the first construction of an object of your class. This
255 saves on overhead for classes that are never instantiated or those
256 without "DEMOLISH" methods. If you try to define your own "DESTROY",
257 this will cause undefined results.
258
259IMPORTED SUBROUTINES
260 extends
261 extends 'Parent::Class';
262
263 Declares a base class. Multiple superclasses can be passed for multiple
264 inheritance but please consider using roles instead. The class will be
265 loaded but no errors will be triggered if the class can't be found and
266 there are already subs in the class.
267
268 Calling extends more than once will REPLACE your superclasses, not add
269 to them like 'use base' would.
270
271 with
272 with 'Some::Role1';
273
274 or
275
276 with 'Some::Role1', 'Some::Role2';
277
278 Composes one or more Moo::Role (or Role::Tiny) roles into the current
279 class. An error will be raised if these roles cannot be composed because
280 they have conflicting method definitions. The roles will be loaded using
281 the same mechanism as "extends" uses.
282
283 has
284 has attr => (
285 is => 'ro',
286 );
287
288 Declares an attribute for the class.
289
290 package Foo;
291 use Moo;
292 has 'attr' => (
293 is => 'ro'
294 );
295
296 package Bar;
297 use Moo;
298 extends 'Foo';
299 has '+attr' => (
300 default => sub { "blah" },
301 );
302
303 Using the "+" notation, it's possible to override an attribute.
304
305 has [qw(attr1 attr2 attr3)] => (
306 is => 'ro',
307 );
308
309 Using an arrayref with multiple attribute names, it's possible to
310 declare multiple attributes with the same options.
311
312 The options for "has" are as follows:
313
314 "is"
315 required, may be "ro", "lazy", "rwp" or "rw".
316
317 "ro" stands for "read-only" and generates an accessor that dies if you
318 attempt to write to it - i.e. a getter only - by defaulting "reader"
319 to the name of the attribute.
320
321 "lazy" generates a reader like "ro", but also sets "lazy" to 1 and
322 "builder" to "_build_${attribute_name}" to allow on-demand generated
323 attributes. This feature was my attempt to fix my incompetence when
324 originally designing "lazy_build", and is also implemented by
325 MooseX::AttributeShortcuts. There is, however, nothing to stop you
326 using "lazy" and "builder" yourself with "rwp" or "rw" - it's just
327 that this isn't generally a good idea so we don't provide a shortcut
328 for it.
329
330 "rwp" stands for "read-write protected" and generates a reader like
331 "ro", but also sets "writer" to "_set_${attribute_name}" for
332 attributes that are designed to be written from inside of the class,
333 but read-only from outside. This feature comes from
334 MooseX::AttributeShortcuts.
335
336 "rw" stands for "read-write" and generates a normal getter/setter by
337 defaulting the "accessor" to the name of the attribute specified.
338
339 "isa"
340 Takes a coderef which is used to validate the attribute. Unlike Moose,
341 Moo does not include a basic type system, so instead of doing "isa =>
342 'Num'", one should do
343
344 use Scalar::Util qw(looks_like_number);
345 ...
346 isa => sub {
347 die "$_[0] is not a number!" unless looks_like_number $_[0]
348 },
349
350 Note that the return value for "isa" is discarded. Only if the sub
351 dies does type validation fail.
352
353 Sub::Quote aware
354
355 Since Moo does not run the "isa" check before "coerce" if a coercion
356 subroutine has been supplied, "isa" checks are not structural to your
357 code and can, if desired, be omitted on non-debug builds (although if
358 this results in an uncaught bug causing your program to break, the Moo
359 authors guarantee nothing except that you get to keep both halves).
360
361 If you want Moose compatible or MooseX::Types style named types, look
362 at Type::Tiny.
363
364 To cause your "isa" entries to be automatically mapped to named
365 Moose::Meta::TypeConstraint objects (rather than the default behaviour
366 of creating an anonymous type), set:
367
368 $Moo::HandleMoose::TYPE_MAP{$isa_coderef} = sub {
369 require MooseX::Types::Something;
370 return MooseX::Types::Something::TypeName();
371 };
372
373 Note that this example is purely illustrative; anything that returns a
374 Moose::Meta::TypeConstraint object or something similar enough to it
375 to make Moose happy is fine.
376
377 "coerce"
378 Takes a coderef which is meant to coerce the attribute. The basic idea
379 is to do something like the following:
380
381 coerce => sub {
382 $_[0] % 2 ? $_[0] : $_[0] + 1
383 },
384
385 Note that Moo will always execute your coercion: this is to permit
386 "isa" entries to be used purely for bug trapping, whereas coercions
387 are always structural to your code. We do, however, apply any supplied
388 "isa" check after the coercion has run to ensure that it returned a
389 valid value.
390
391 Sub::Quote aware
392
393 If the "isa" option is a blessed object providing a "coerce" or
394 "coercion" method, then the "coerce" option may be set to just 1.
395
396 "handles"
397 Takes a string
398
399 handles => 'RobotRole'
400
401 Where "RobotRole" is a role that defines an interface which becomes
402 the list of methods to handle.
403
404 Takes a list of methods
405
406 handles => [ qw( one two ) ]
407
408 Takes a hashref
409
410 handles => {
411 un => 'one',
412 }
413
414 "trigger"
415 Takes a coderef which will get called any time the attribute is set.
416 This includes the constructor, but not default or built values. The
417 coderef will be invoked against the object with the new value as an
418 argument.
419
420 If you set this to just 1, it generates a trigger which calls the
421 "_trigger_${attr_name}" method on $self. This feature comes from
422 MooseX::AttributeShortcuts.
423
424 Note that Moose also passes the old value, if any; this feature is not
425 yet supported.
426
427 Sub::Quote aware
428
429 "default"
430 Takes a coderef which will get called with $self as its only argument
431 to populate an attribute if no value for that attribute was supplied
432 to the constructor. Alternatively, if the attribute is lazy, "default"
433 executes when the attribute is first retrieved if no value has yet
434 been provided.
435
436 If a simple scalar is provided, it will be inlined as a string. Any
437 non-code reference (hash, array) will result in an error - for that
438 case instead use a code reference that returns the desired value.
439
440 Note that if your default is fired during new() there is no guarantee
441 that other attributes have been populated yet so you should not rely
442 on their existence.
443
444 Sub::Quote aware
445
446 "predicate"
447 Takes a method name which will return true if an attribute has a
448 value.
449
450 If you set this to just 1, the predicate is automatically named
451 "has_${attr_name}" if your attribute's name does not start with an
452 underscore, or "_has_${attr_name_without_the_underscore}" if it does.
453 This feature comes from MooseX::AttributeShortcuts.
454
455 "builder"
456 Takes a method name which will be called to create the attribute -
457 functions exactly like default except that instead of calling
458
459 $default->($self);
460
461 Moo will call
462
463 $self->$builder;
464
465 The following features come from MooseX::AttributeShortcuts:
466
467 If you set this to just 1, the builder is automatically named
468 "_build_${attr_name}".
469
470 If you set this to a coderef or code-convertible object, that variable
471 will be installed under "$class::_build_${attr_name}" and the builder
472 set to the same name.
473
474 "clearer"
475 Takes a method name which will clear the attribute.
476
477 If you set this to just 1, the clearer is automatically named
478 "clear_${attr_name}" if your attribute's name does not start with an
479 underscore, or "_clear_${attr_name_without_the_underscore}" if it
480 does. This feature comes from MooseX::AttributeShortcuts.
481
482 NOTE: If the attribute is "lazy", it will be regenerated from
483 "default" or "builder" the next time it is accessed. If it is not
484 lazy, it will be "undef".
485
486 "lazy"
487 Boolean. Set this if you want values for the attribute to be grabbed
488 lazily. This is usually a good idea if you have a "builder" which
489 requires another attribute to be set.
490
491 "required"
492 Boolean. Set this if the attribute must be passed on object
493 instantiation.
494
495 "reader"
496 The name of the method that returns the value of the attribute. If you
497 like Java style methods, you might set this to "get_foo"
498
499 "writer"
500 The value of this attribute will be the name of the method to set the
501 value of the attribute. If you like Java style methods, you might set
502 this to "set_foo".
503
504 "weak_ref"
505 Boolean. Set this if you want the reference that the attribute
506 contains to be weakened. Use this when circular references, which
507 cause memory leaks, are possible.
508
509 "init_arg"
510 Takes the name of the key to look for at instantiation time of the
511 object. A common use of this is to make an underscored attribute have
512 a non-underscored initialization name. "undef" means that passing the
513 value in on instantiation is ignored.
514
515 "moosify"
516 Takes either a coderef or array of coderefs which is meant to
517 transform the given attributes specifications if necessary when
518 upgrading to a Moose role or class. You shouldn't need this by
519 default, but is provided as a means of possible extensibility.
520
521 before
522 before foo => sub { ... };
523
524 See "before method(s) => sub { ... };" in Class::Method::Modifiers for
525 full documentation.
526
527 around
528 around foo => sub { ... };
529
530 See "around method(s) => sub { ... };" in Class::Method::Modifiers for
531 full documentation.
532
533 after
534 after foo => sub { ... };
535
536 See "after method(s) => sub { ... };" in Class::Method::Modifiers for
537 full documentation.
538
539SUB QUOTE AWARE
540 "quote_sub" in Sub::Quote allows us to create coderefs that are
541 "inlineable," giving us a handy, XS-free speed boost. Any option that is
542 Sub::Quote aware can take advantage of this.
543
544 To do this, you can write
545
546 use Sub::Quote;
547
548 use Moo;
549 use namespace::clean;
550
551 has foo => (
552 is => 'ro',
553 isa => quote_sub(q{ die "Not <3" unless $_[0] < 3 })
554 );
555
556 which will be inlined as
557
558 do {
559 local @_ = ($_[0]->{foo});
560 die "Not <3" unless $_[0] < 3;
561 }
562
563 or to avoid localizing @_,
564
565 has foo => (
566 is => 'ro',
567 isa => quote_sub(q{ my ($val) = @_; die "Not <3" unless $val < 3 })
568 );
569
570 which will be inlined as
571
572 do {
573 my ($val) = ($_[0]->{foo});
574 die "Not <3" unless $val < 3;
575 }
576
577 See Sub::Quote for more information, including how to pass lexical
578 captures that will also be compiled into the subroutine.
579
580CLEANING UP IMPORTS
581 Moo will not clean up imported subroutines for you; you will have to do
582 that manually. The recommended way to do this is to declare your imports
583 first, then "use Moo", then "use namespace::clean". Anything imported
584 before namespace::clean will be scrubbed. Anything imported or declared
585 after will be still be available.
586
587 package Record;
588
589 use Digest::MD5 qw(md5_hex);
590
591 use Moo;
592 use namespace::clean;
593
594 has name => (is => 'ro', required => 1);
595 has id => (is => 'lazy');
596 sub _build_id {
597 my ($self) = @_;
598 return md5_hex($self->name);
599 }
600
601 1;
602
603 For example if you were to import these subroutines after
604 namespace::clean like this
605
606 use namespace::clean;
607
608 use Digest::MD5 qw(md5_hex);
609 use Moo;
610
611 then any "Record" $r would have methods such as "$r->md5_hex()",
612 "$r->has()" and "$r->around()" - almost certainly not what you intend!
613
614 Moo::Roles behave slightly differently. Since their methods are composed
615 into the consuming class, they can do a little more for you
616 automatically. As long as you declare your imports before calling "use
617 Moo::Role", those imports and the ones Moo::Role itself provides will
618 not be composed into consuming classes so there's usually no need to use
619 namespace::clean.
620
621 On namespace::autoclean: Older versions of namespace::autoclean would
622 inflate Moo classes to full Moose classes, losing the benefits of Moo.
623 If you want to use namespace::autoclean with a Moo class, make sure you
624 are using version 0.16 or newer.
625
626INCOMPATIBILITIES WITH MOOSE
627 TYPES
628 There is no built-in type system. "isa" is verified with a coderef; if
629 you need complex types, Type::Tiny can provide types, type libraries,
630 and will work seamlessly with both Moo and Moose. Type::Tiny can be
631 considered the successor to MooseX::Types and provides a similar API, so
632 that you can write
633
634 use Types::Standard qw(Int);
635 has days_to_live => (is => 'ro', isa => Int);
636
637 API INCOMPATIBILITIES
638 "initializer" is not supported in core since the author considers it to
639 be a bad idea and Moose best practices recommend avoiding it. Meanwhile
640 "trigger" or "coerce" are more likely to be able to fulfill your needs.
641
642 No support for "super", "override", "inner", or "augment" - the author
643 considers augment to be a bad idea, and override can be translated:
644
645 override foo => sub {
646 ...
647 super();
648 ...
649 };
650
651 around foo => sub {
652 my ($orig, $self) = (shift, shift);
653 ...
654 $self->$orig(@_);
655 ...
656 };
657
658 The "dump" method is not provided by default. The author suggests
659 loading Devel::Dwarn into "main::" (via "perl -MDevel::Dwarn ..." for
660 example) and using "$obj->$::Dwarn()" instead.
661
662 "default" only supports coderefs and plain scalars, because passing a
663 hash or array reference as a default is almost always incorrect since
664 the value is then shared between all objects using that default.
665
666 "lazy_build" is not supported; you are instead encouraged to use the "is
667 => 'lazy'" option supported by Moo and MooseX::AttributeShortcuts.
668
669 "auto_deref" is not supported since the author considers it a bad idea
670 and it has been considered best practice to avoid it for some time.
671
672 "documentation" will show up in a Moose metaclass created from your
673 class but is otherwise ignored. Then again, Moose ignores it as well, so
674 this is arguably not an incompatibility.
675
676 Since "coerce" does not require "isa" to be defined but Moose does
677 require it, the metaclass inflation for coerce alone is a trifle insane
678 and if you attempt to subtype the result will almost certainly break.
679
680 Handling of warnings: when you "use Moo" we enable strict and warnings,
681 in a similar way to Moose. The authors recommend the use of
682 "strictures", which enables FATAL warnings, and several extra pragmas
683 when used in development: indirect, multidimensional, and
684 bareword::filehandles.
685
686 Additionally, Moo supports a set of attribute option shortcuts intended
687 to reduce common boilerplate. The set of shortcuts is the same as in the
688 Moose module MooseX::AttributeShortcuts as of its version 0.009+. So if
689 you:
690
691 package MyClass;
692 use Moo;
693 use strictures 2;
694
695 The nearest Moose invocation would be:
696
697 package MyClass;
698
699 use Moose;
700 use warnings FATAL => "all";
701 use MooseX::AttributeShortcuts;
702
703 or, if you're inheriting from a non-Moose class,
704
705 package MyClass;
706
707 use Moose;
708 use MooseX::NonMoose;
709 use warnings FATAL => "all";
710 use MooseX::AttributeShortcuts;
711
712 META OBJECT
713 There is no meta object. If you need this level of complexity you need
714 Moose - Moo is small because it explicitly does not provide a
715 metaprotocol. However, if you load Moose, then
716
717 Class::MOP::class_of($moo_class_or_role)
718
719 will return an appropriate metaclass pre-populated by Moo.
720
721 IMMUTABILITY
722 Finally, Moose requires you to call
723
724 __PACKAGE__->meta->make_immutable;
725
726 at the end of your class to get an inlined (i.e. not horribly slow)
727 constructor. Moo does it automatically the first time ->new is called on
728 your class. ("make_immutable" is a no-op in Moo to ease migration.)
729
730 An extension MooX::late exists to ease translating Moose packages to Moo
731 by providing a more Moose-like interface.
732
733COMPATIBILITY WITH OLDER PERL VERSIONS
734 Moo is compatible with perl versions back to 5.6. When running on older
735 versions, additional prerequisites will be required. If you are
736 packaging a script with its dependencies, such as with App::FatPacker,
737 you will need to be certain that the extra prerequisites are included.
738
739 MRO::Compat
740 Required on perl versions prior to 5.10.0.
741
742 Devel::GlobalDestruction
743 Required on perl versions prior to 5.14.0.
744
745SUPPORT
746 IRC: #moose on irc.perl.org
747
748 Bugtracker: <https://rt.cpan.org/Public/Dist/Display.html?Name=Moo>
749
750 Git repository: <git://github.com/moose/Moo.git>
751
752 Git browser: <https://github.com/moose/Moo>
753
754AUTHOR
755 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
756
757CONTRIBUTORS
758 dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
759
760 frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
761
762 hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
763
764 jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
765
766 ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
767
768 chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
769
770 ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
771
772 doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
773
774 perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
775
776 Mithaldu - Christian Walde (cpan:MITHALDU)
777 <walde.christian@googlemail.com>
778
779 ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
780
781 tobyink - Toby Inkster (cpan:TOBYINK) <tobyink@cpan.org>
782
783 haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
784
785 mattp - Matt Phillips (cpan:MATTP) <mattp@cpan.org>
786
787 bluefeet - Aran Deltac (cpan:BLUEFEET) <bluefeet@gmail.com>
788
789 bubaflub - Bob Kuo (cpan:BUBAFLUB) <bubaflub@cpan.org>
790
791 ether = Karen Etheridge (cpan:ETHER) <ether@cpan.org>
792
793COPYRIGHT
794 Copyright (c) 2010-2015 the Moo "AUTHOR" and "CONTRIBUTORS" as listed
795 above.
796
797LICENSE
798 This library is free software and may be distributed under the same
799 terms as perl itself. See <https://dev.perl.org/licenses/>.
800
801