Moose — расширение объектно-ориентированной подсистемы для Perl 5. Добавляет к Perl современные средства ООП, источником идей для Moose были CLOS, Perl 6 и множество других языков, таких, как Smalltalk, Java, BETA, OCaml, Ruby и др..

Особенности

Объектно-ориентированное программирование в Moose, как и Perl 6 основывается, помимо классов и объектов, на механизме ролей, одной из альтернатив множественному наследованию (которое, впрочем, тоже поддерживается).

Атрибуты (свойства классов) классов поддерживают делегирование и отложенную инициализацию.

Роли основаны на типажах и выполняют ту же роль, что и классы-примеси. Они напоминают интерфейсы, но в отличие от них включают реализацию методов по умолчанию.

Объектная система Moose поддерживает резидентную метамодель: её можно изменять и расширять путём написания классов и ролей средствами самого Moose. Moose используется многими CPAN-расширениями, существует ряд модулей расширения Moose. Начиная с версии 5.8 на объектной системе Moose основан Model-View-Controller веб-фреймвок Catalyst

Пример Ниже определяется класс Point (точка) и его подкласс Point3D (3-мерная точка):

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;

extends 'Point';

has 'z' => (isa => 'Num', is => 'rw');

after 'clear' => sub { my $self = shift; $self->z(0);

sub set_to { @_ == 4 or croak "Bad number of arguments"; my $self = shift; my ($x, $y, $z) = @_; $self->x($x); $self->y($y); $self->z($z); }

В классе Point3D переопределяется методы set_to() и clear(), первый из них не вызывает метод родительского класса, второй — вызывает.

См. также Moo (Perl)

Примечания

Литература

,

Ссылки Moose Homepage Moose Documentation Moose: ООП в Perl Moose(X). Продолжение

категория:модули Perl