Moose es una extensión del sistema de objetos del lenguaje de programación Perl . Su propósito declarado [1] es incorporar características de lenguaje de programación orientado a objetos moderno a Perl 5 y hacer que la programación orientada a objetos en Perl sea más consistente y menos tediosa.
Moose se basa en Class::MOP
, un protocolo de metaobjetos (MOP). Mediante el uso de MOP, Moose proporciona una introspección de tipos completa para todas las clases que utilizan Moose.
Moose permite a un programador crear clases :
Un atributo es una propiedad de la clase que lo define.
Los roles en Moose se basan en rasgos . Realizan una tarea similar a la de los mixins , pero se componen horizontalmente en lugar de heredarse. También son algo así como las interfaces , pero a diferencia de algunas implementaciones de interfaces, pueden proporcionar una implementación predeterminada. Los roles se pueden aplicar a instancias individuales, así como a clases.
Hay varios módulos de extensión de Moose en CPAN . A partir de septiembre de 2012, [actualizar]hay 855 módulos en 266 distribuciones en el espacio de nombres MooseX. [2] La mayoría de ellos se pueden instalar opcionalmente con el módulo Task::Moose. [3]
Este es un ejemplo de una clase Point
y su subclase Point3D
:
paquete Punto ; utilizar Alce ; utilizar Carpa ; tiene 'x' => ( isa => 'Num' , es => 'rw' ); tiene 'y' = > ( isa => 'Num' , es => 'rw' ); sub clear { mi $self = shift ; $self -> x ( 0 ); $self -> y ( 0 ); } sub set_to { @_ == 3 o croak "Número incorrecto de argumentos" ; my $self = shift ; my ( $x , $y ) = @_ ; $self -> x ( $x ); $self -> y ( $y ); } paquete Point3D ; utilizar Moose ; utilizar Carp ; extiende 'Punto' ; tiene 'z' => ( isa => 'Num' , es => 'rw' ); después de 'borrar' => sub { mi $self = shift ; $self -> z ( 0 ); }; sub set_to { @_ == 4 o croak "Número incorrecto de argumentos" ; my $self = shift ; my ( $x , $y , $z ) = @_ ; $self -> x ( $x ); $self -> y ( $y ); $self -> z ( $z ); }
Hay un nuevo set_to()
método en la Point3D
clase, por lo que el método del mismo nombre definido en la Point
clase no se invoca en el caso de Point3D
instancias. clear()
Por otro lado, el método no se reemplaza, sino que se extiende en la subclase, por lo que ambos métodos se ejecutan en el orden correcto.
Esto es lo mismo usando la MooseX::Declare
extensión:
utilizar MooseX::Declare ; clase Punto { tiene 'x' => ( isa => 'Num' , es => 'rw' ); tiene 'y' => ( isa => 'Num' , es => 'rw' ); método clear { $self -> x ( 0 ); $self -> y ( 0 ); } método set_to ( Num $x , Num $y ) { $self -> x ( $x ); $self -> y ( $y ); } } clase Point3D extiende Point { tiene 'z' => ( isa => 'Num' , es => 'rw' ); después de borrar { $self -> z ( 0 ); } método set_to ( Num $x , Num $y , Num $z ) { $self -> x ( $x ); $self -> y ( $y ); $self -> z ( $z ); } }