1Moo(3)                User Contributed Perl Documentation               Moo(3)
2
3
4

NAME

6       Moo - Minimalist Object Orientation (with Moose compatibility)
7

SYNOPSIS

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

DESCRIPTION

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

WHY MOO EXISTS

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

MOO AND MOOSE

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

MOO AND CLASS::XSACCESSOR

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

MOO VERSUS ANY::MOOSE

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

PUBLIC METHODS

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

LIFECYCLE METHODS

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

IMPORTED SUBROUTINES

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

SUB QUOTE AWARE

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

CLEANING UP IMPORTS

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

INCOMPATIBILITIES WITH MOOSE

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

COMPATIBILITY WITH OLDER PERL VERSIONS

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

SUPPORT

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

AUTHOR

762       mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
763

CONTRIBUTORS

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

LICENSE

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)
Impressum