• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

lib/H29-Mar-2021-3,6162,289

maint/H29-Mar-2021-138

t/H29-Mar-2021-5,9614,654

xt/H29-Mar-2021-2,9312,271

ChangesH A D29-Mar-202129.5 KiB671581

LICENSEH A D29-Mar-202117.8 KiB375289

MANIFESTH A D29-Mar-20213.6 KiB149148

META.jsonH A D29-Mar-20212.5 KiB9695

META.ymlH A D29-Mar-20211.3 KiB4847

Makefile.PLH A D21-Feb-20214.9 KiB167150

READMEH A D29-Mar-202127.1 KiB801585

README

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