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