Рассмотрите возможность использования Moose для ваших нужд OO Perl.
Я создал версию вашего объекта Moose, которая включает атрибут с атрибутом, включающим делегирование черты Array, включая каррирование делегированных методов. Moose предлагает простые способы создания мощных, инкапсулированных классов без написания множества шаблонов.
Я создал класс Pack
с атрибутами: nom
, nbports
, gio
и tab
.
nom
является строкой только для чтения и требуется при создании объекта.
nbports
является целочисленным значением только для чтения и по умолчанию равно 32, если не указано.
gio
является необязательным логическим значением для чтения и записи.
tab
это массив строк. Все виды поведения были определены для tab
:
all_tabs
возвращает список содержимого tabs
add_tab
помещает значения в конец tabs
tab_count
возвращает количество элементов в tabs
alpha_tabs
возвращает список членов tabs
в алфавитном порядке
turn_tabs
возвращает список строк в tabs
, но с обратными буквами
Любые попытки установить атрибут проверяются на правильность типа.
Moose создает все необходимые методы для поддержки этого сложного поведения с помощью следующего кода:
package Pack;
use Moose;
has 'nom' => (
is => 'ro',
isa => 'Str',
required => 1,
);
has 'nbports' => (
is => 'ro',
isa => 'Int',
default => 32,
);
has 'gio' => (
is => 'rw',
isa => 'Bool',
predicate => 'has_gio',
);
has 'tab' => (
traits => ['Array'],
is => 'ro',
isa => 'ArrayRef[Str]',
default => sub {[]},
handles => {
all_tabs => 'elements',
add_tab => 'push',
turn_tabs => [ 'map', sub { reverse } ],
tab_count => 'count',
alpha_tabs => [ 'sort', sub { lc($a) cmp lc($b) } ],
},
);
__PACKAGE__->meta->make_immutable;
no Moose;
1;
Можно использовать так:
my $p = Pack->new( nom => 'Roger', tab => [qw( fee fie foe fum )] );
my $gio_state = 'UNSET';
if( $p->has_gio ) {
$gio_state = $p->gio ? 'TRUE' : 'FALSE';
}
print "GIO is $gio_state\n";
my @turned = $p->turn_tabs; # eef eif eof muf
$p->add_tabs( 'faa', 'fim' );
my @sorted = $p->alpha_tabls; # faa fee fie fim foe fum
my $count = $p->tab_count; # 6
my $ports = $p->nbports; # 32