Я не уверен, какая модификация вам нужна, но вы могли бы добиться того, что вам нужно, с помощью приведения типов:
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
Эта слабость может быть в порядке или может сделать этот подход непригодным При правильных обстоятельствах это может быть даже преимуществом.