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