考虑使用
Moose来满足你的Perl面向对象编程需求。
我创建了一个包含Array trait委托属性的Moose版本对象,其中包括委托方法的柯里化。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;
$p->add_tabs( 'faa', 'fim' );
my @sorted = $p->alpha_tabls;
my $count = $p->tab_count;
my $ports = $p->nbports;