【发布时间】:2015-06-11 21:58:00
【问题描述】:
我有一个带有 InnerClass 对象作为属性的 WrapperClass 对象。 InnerClass 对象有一个权重属性。我的 WrapperClass 对象也有一个 weight 属性,我希望它的默认值是 InnerClass 对象的 weight 属性的值。
#!/usr/bin/perl
package InnerClass;
use Moose;
has 'weight' => (
is => 'rw',
);
package WrapperClass;
use Moose;
has 'wrapped' => (
is => 'rw',
lazy => 1,
default => sub {InnerClass->new(weight => 1)},
);
has 'weight' => (
is => 'rw',
default => sub {
my $self = shift;
$self->wrapped->weight()
},
lazy => 1,
);
上面的代码可以工作,但实际上 InnerClass 有许多 WrapperClass 需要做同样事情的属性。理想情况下,我在编写 WrapperClass 时会这样做:
use Moose;
has 'wrapped' => (
is => 'rw',
);
my @getDefaultsFromWrappers
= qw(weight height mass x y z label); # etc ...
foreach my $attr (@getDefaultsFromWrappers) {
has $attr => (
is => 'rw',
default => sub {
# Somehow tell the default which attribute
# it needs to call from wrapped object?
my $self = shift;
$self->wrapped->???()
},
lazy => 1,
);
}
但是,无法将参数传递给默认值或构建器来告诉它正在构建哪个属性。我考虑过使用caller,但这似乎是一种黑客攻击。
有谁知道我怎样才能完成这种属性声明风格,还是单独声明每个属性及其默认值?
【问题讨论】: