Moose (Perl)Moose — расширение объектно-ориентированной подсистемы для Perl 5. Добавляет к Perl современные средства ООП, источником идей для Moose были CLOS, Perl 6 и множество других языков[1], таких, как Smalltalk, Java, BETA, OCaml, Ruby и др.[2]. ОсобенностиОбъектно-ориентированное программирование в Moose, как и Perl 6 основывается, помимо классов и объектов, на механизме ролей, одной из альтернатив множественному наследованию (которое, впрочем, тоже поддерживается). Атрибуты (свойства классов) классов поддерживают делегирование и отложенную инициализацию. Роли основаны на типажах и выполняют ту же роль, что и классы-примеси. Они напоминают интерфейсы, но в отличие от них включают реализацию методов по умолчанию. Объектная система Moose поддерживает резидентную метамодель: её можно изменять и расширять путём написания классов и ролей средствами самого Moose. Moose используется многими CPAN-расширениями, существует ряд модулей расширения Moose[1]. Начиная с версии 5.8 на объектной системе Moose основан Model-View-Controller веб-фреймвок Catalyst [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);
}
В классе См. такжеПримечания
Литература
Ссылки
Information related to Moose (Perl) |