如果你有一个属性需要在任何时间被修改的时候被修改,那么在这个例子中完成的是,有没有一个光滑的方式来做这个,而不是自己编写访问器,直接用$ self的内容来填充它。
package Foo; use Moose; has 'bar' => ( isa => 'Str',reader => 'get_bar',); sub set_bar { my ($self,$bar) = @_; $self->{bar} = "modified: $bar"; }
我认为触发,但似乎需要相同的方法。
在Moose年的自我认为的糟糕做法中直接使用哈希引用工作,还是担心无问题?
解决方法
我不知道你需要什么样的修改,但是您可以通过使用类型强制来实现所需要的功能:
package Foo; use Moose; use Moose::Util::TypeConstraints; subtype 'ModStr' => as 'Str' => where { /^modified: /}; coerce 'ModStr' => from 'Str' => via { "modified: $_" }; has 'bar' => ( isa => 'ModStr',is => 'rw',coerce => 1,);
如果您使用这种方法,并不是所有的值都将被修改。任何通过验证作为ModStr的内容将被直接使用:
my $f = Foo->new(); $f->bar('modified: bar'); # Set without modification
这个弱点可能还是可以使这种方法不可用。在正确的情况下,甚至可能是一个优势。