我的Moose课程消耗了一个我不允许改变的角色。该角色定义具有默认值的属性。我需要我的类具有该属性,但具有不同的默认值。
这可能吗?
所有我能想到的是用我自己的一些代码围绕“新”方法,如下所示:
around new => sub {
my ($orig, $self) = (shift, shift);
return $self->$orig(@_, the_attribute => $new_value);
}
但我不确定周围的新品是否有效,并且还希望有更优雅的东西。
答案 0 :(得分:8)
更好,更简单的方法是在课堂上写这个:
has '+the_attribute' => (
default => sub{1},
}
使用has
的 +
可以覆盖属性的特定属性。
比周围的BUILDARGS简单得多。
答案 1 :(得分:4)
您有正确的想法,但不应该覆盖new
。 Moose::Manual::BestPractices说:
永远不要覆盖新的
覆盖
new
是一种非常糟糕的做法。相反,您应该使用BUILD
或BUILDARGS
方法来执行相同的操作。当您重写new
时,当您的类不稳定时,Moose不能再内联构造函数。
我已经做了一段时间了,但我认为以下内容可以解决问题:
around BUILDARGS => sub {
my $orig = shift;
my $class = shift;
return $self->$orig(
the_attribute => $new_value,
@_ == 1 ? %{ $_[0] } : @_,
);
};
注意:
->new({ ... })
和->new(...)
仍然有用。如果您不关心违反@_
,则可以使用@_ == 1 ? %{ $_[0] } : @_
代替->new({ ... })
。