У меня есть объект WrapperClass, который имеет объект InnerClass как атрибут. Объект InnerClass имеет атрибут веса. Мой объект WrapperClass также имеет атрибут веса, и я хочу, чтобы его значение по умолчанию было независимо от значения атрибута веса объекта InnerClass.Создание атрибутов по умолчанию путем вызова обернутого объекта
#!/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
, но это похоже на взлом.
Кто-нибудь знает, как я мог выполнить этот стиль объявления атрибута, или это случай объявления каждого атрибута и его значения по умолчанию отдельно?