在Moose中,如果角色使用默认值定义属性,如何在我的消费类中更改该默认值?

时间:2013-03-10 17:55:26

标签: perl moose moo

我的Moose课程消耗了一个我不允许改变的角色。该角色定义具有默认值的属性。我需要我的类具有该属性,但具有不同的默认值。

这可能吗?

所有我能想到的是用我自己的一些代码围绕“新”方法,如下所示:

around new => sub {
    my ($orig, $self) = (shift, shift);
    return $self->$orig(@_, the_attribute => $new_value);
}

但我不确定周围的新品是否有效,并且还希望有更优雅的东西。

2 个答案:

答案 0 :(得分:8)

更好,更简单的方法是在课堂上写这个:

has '+the_attribute' => (
    default => sub{1},
}
使用has

+可以覆盖属性的特定属性。

比周围的BUILDARGS简单得多。

答案 1 :(得分:4)

您有正确的想法,但不应该覆盖newMoose::Manual::BestPractices说:

  

永远不要覆盖新的

     

覆盖new是一种非常糟糕的做法。相反,您应该使用BUILDBUILDARGS方法来执行相同的操作。当您重写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({ ... })