Moose is an extension of the object system of the Perl programming language. Its stated purpose is to bring modern object-oriented language features to Perl 5, and to make object-oriented Perl programming more consistent and less tedious. Features Moose is built on top of Class::MOP, a metaobject protocol (a.k.a. MOP). Using the MOP, Moose provides complete introspection for all Moose-using classes. Classes Moose allows a programmer to create classes: A class has zero or more attributes. A class has zero or more methods. A class has zero or more superclasses (a.k.a. parent classes). A class inherits from its superclass(es). Moose supports multiple inheritance. A class has zero or more method modifiers. These modifiers can apply to its own methods, methods that are inherited from its ancestors or methods that are provided by roles. A class does zero or more roles (also known as traits in other programming languages). A class has a constructor and a destructor. A class has a metaclass. Attributes An attribute is a property of the class that defines it. An attribute always has a name, and it may have a number of other defining characteristics. An attribute's characteristics may include a read/write flag, a type, accessor method names, delegations, a default value and lazy initialization. Roles Roles in Moose are based on traits. They perform a similar task as mixins, but are composed horizontally rather than inherited. They are also somewhat like interfaces, but unlike some implementations of interfaces they can provide a default implementation. Roles can be applied to individual instances as well as Classes. A role has zero or more attributes. A role has zero or more methods. A role has zero or more method modifiers. A role has zero or more required methods. Extensions There are a number of Moose extension modules on CPAN. there are 855 modules in 266 distributions in the MooseX namespace. Most of them can be optionally installed with the Task::Moose module. Examples This is an example of a class Point and its subclass Point3D: package Point; use Moose; use Carp; has 'x' => (isa => 'Num', is => 'rw'); has 'y' => (isa => 'Num', is => 'rw'); sub clear { my $self = shift; $self->x(0); $self->y(0); } sub set_to { @_ == 3 or croak "Bad number of arguments"; my $self = shift; my ($x, $y) = @_; $self->x($x); $self->y($y); } package Point3D; use Moose; use Carp;