Perl
- 1 year ago
- 0
- 0
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()
, первый из них не вызывает метод родительского класса, второй — вызывает.