Эта статья включает список общих ссылок , но в ней отсутствуют соответствующие встроенные цитаты . ( Май 2010 ) |
Moose — это расширение объектной системы языка программирования Perl . Его заявленная цель [1] — привнести современные возможности объектно-ориентированного языка программирования в Perl 5 и сделать объектно-ориентированное программирование на Perl более последовательным и менее утомительным.
Moose построен на Class::MOP
, метаобъектном протоколе (MOP). Используя MOP, Moose обеспечивает полную интроспекцию типов для всех классов, использующих Moose.
Moose позволяет программисту создавать классы :
Атрибут — это свойство класса, который его определяет.
Роли в Moose основаны на признаках . Они выполняют ту же задачу, что и миксины , но составляются горизонтально, а не наследуются. Они также чем-то похожи на интерфейсы , но в отличие от некоторых реализаций интерфейсов они могут предоставлять реализацию по умолчанию. Роли можно применять как к отдельным экземплярам, так и к классам.
На CPAN есть несколько модулей расширения Moose . По состоянию на сентябрь 2012 года [обновлять]в пространстве имен MooseX имеется 855 модулей в 266 дистрибутивах. [2] Большинство из них можно опционально установить с помощью модуля Task::Moose. [3]
Это пример класса Point
и его подкласса Point3D
:
пакет Точка ; использовать Лося ; использовать Карпа ; имеет 'x' => ( isa => 'Num' , is => 'rw' ); имеет ' y' = > ( isa => 'Num' , is => 'rw' ); подчистка { мой $self = сдвиг ; $self -> x ( 0 ) ; $self -> y ( 0 ); } sub set_to { @_ == 3 или квакает "Неправильное количество аргументов" ; my $self = shift ; my ( $x , $y ) = @_ ; $self -> x ( $x ); $self -> y ( $y ); } пакет Point3D ; использовать Moose ; использовать Carp ; расширяет «Точку» ; имеет 'z' => ( isa => 'Num' , is => 'rw' ); после 'clear' => sub { my $self = shift ; $self -> z ( 0 ); }; sub set_to { @_ == 4 или квакает "Неправильное количество аргументов" ; my $self = shift ; my ( $x , $y , $z ) = @_ ; $self -> x ( $x ); $self -> y ( $y ); $self -> z ( $z ); }
set_to()
В классе есть новый метод Point3D
, поэтому метод с тем же именем, определенный в Point
классе, не вызывается в случае Point3D
экземпляров. clear()
С другой стороны, метод не заменяется, а расширяется в подклассе, поэтому оба метода запускаются в правильном порядке.
То же самое с использованием MooseX::Declare
расширения:
использовать MooseX::Declare ; класс Point { имеет 'x' => ( isa => 'Num' , is => 'rw' ); имеет 'y' => ( isa => 'Num' , is => 'rw' ); метод clear { $self -> x ( 0 ); $self -> y ( 0 ); } метод set_to ( Num $x , Num $y ) { $self -> x ( $x ); $self -> y ( $y ); } } класс Point3D расширяет Point { has 'z' => ( isa => 'Num' , is => 'rw' ); после очистки { $self -> z ( 0 ); } метод set_to ( Num $x , Num $y , Num $z ) { $self -> x ( $x ); $self -> y ( $y ); $self -> z ( $z ); } }