【发布时间】:2020-06-07 02:42:54
【问题描述】:
我希望能够声明所需的一组相互依赖的属性中的一个。
让我们假设一个简单的例子,数字 'nr_two' 是 'nr_one' + 1,而 'nr_one' 是 'nr_two' -1,其中一个必须在初始化时传入。
到目前为止,我已经看到这个问题已经解决了,例如通过 BUILDARGS 检查和每个懒惰的构建器:
has 'nr_one' => (
is => 'ro',
isa => 'Num',
lazy => 1,
builder => '_build_nr_one',
);
sub _build_nr_one { shift->nr_two - 1; }
has 'nr_two' => (
is => 'ro',
isa => 'Num',
lazy => 1,
builder => '_build_nr_two',
);
sub _build_nr_two { shift->nr_one + 1; }
around 'BUILDARGS' => sub {
my $orig = shift;
my $self = shift;
my $args = is_hashref($_[0])? $_[0] : { @_ };
die "Either nr_one or nr_two is required!" unless defined $args{nr_one} || defined $args{nr_two};
return $self->$orig($args);
};
或者,避开周围:
has 'nr_one' => (
is => 'ro',
isa => 'Num',
predicate => 'has_nr_one',
lazy => 1,
builder => '_build_nr_one',
);
sub _build_nr_one { shift->nr_two - 1; }
has 'nr_two' => (
is => 'ro',
isa => 'Num',
predicate => 'has_nr_two',
lazy => 1,
builder => '_build_nr_two',
);
sub _build_nr_two { shift->nr_one + 1; }
sub BUILD {
my $self = shift;
die "Either nr_one or nr_two is required!" unless $self->has_nr_one || $self->has_nr_two;
}
但是,我正在寻找可以在属性上声明的东西, 例如某种分组,然后可以进行自省,例如在 BUILD 中触发。
理想情况下,我想将其发送到通用角色或 Meta 类中以使其可用 使用某种更好的语法,以避免检查 BUILD(ARGS) 检查 或者依靠 pod 准确地声明事物。
是否有 cpan 模块可以帮助解决这个问题,或者有人知道实现这一点的模式? 任何提示/部分解决方案表示赞赏,如果不是:)
我想象的一个例子是这样的:
has 'nr_one' => (
is => 'ro',
isa => 'Num',
lazy => 1,
builder => '_build_nr_one',
required_grouping => 'NumberGroup',
);
sub _build_nr_one { shift->nr_two - 1; }
has 'nr_two' => (
is => 'ro',
isa => 'Num',
lazy => 1,
builder => '_build_nr_two',
required_grouping => 'NumberGroup',
);
sub _build_nr_two { shift->nr_one + 1; }
# when initialized without any attributes, error thrown:
# "One of 'nr_one', 'nr_two' is required"
# or, probably easier: "NumberGroup required!"
【问题讨论】:
-
请举例说明分组应该如何工作
-
完成,@HåkonHægland 。我很高兴有其他可以满足我需求的建议,不过,不要被这个例子束缚。