我有几个包:
package FOO;
use Moose;
has 'obj' => (is=>'ro');
sub hash {
my $self = shift;
return $self->make_hash($self->obj};
}
以及另一个扩展FOO的封装:
package FOOBAR;
use Moose;
extends 'FOO';
has [qw/val1 val2/] => (is => 'rw');
sub BUILD {
my ($self) = @_;
$self->val1($self->hash->{val1});
$self->val2($self->hash->{val2});
}
基本上,我想做FOOBAR->new(obj=>$obj);
,并使用从$obj
生成的哈希来填充FOOBAR
中指定的属性(大约20个属性)
像这样使用"BUILD"是解决问题的好方法吗?
为什么?然后你会得到两份数据副本。改为委派。
has obj => (
is => 'ro',
handles => {
val1 => sub { my $self = shift; my $obj = $self->obj; ... },
val2 => sub { my $self = shift; my $obj = $self->obj; ... },
},
);
如果访问者实际上是相同的,你可以做一些类似的事情
sub make_obj_accessor {
my ($name) = @_;
return sub {
my $self = shift;
my $obj = $self->obj;
... $name ...
};
}
has obj => (
is => 'ro',
handles => {
(map make_obj_accessor($_), qw(
val1
val2
))
},
);
当然,如果你真的只有一个散列,你只需要
FOOBAR->new( %hash )