Вы могли использовать обратная функция с соответствующими параметрами для получения текущего URL.
Я не уверен, какая модификация вам нужна, но вы можете добиться того, что вам нужно, используя приведение типов:
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
Эта слабость может быть в порядке или может сделать этот подход непригодным для использования. В правильных обстоятельствах это может быть даже преимуществом.
Вы можете использовать модификатор метода 'around'. Примерно так:
has 'bar' => (
isa => 'Str',
reader => 'get_bar',
writer => 'set_bar'
);
around 'set_bar' => sub {
my ($next, $self, $bar) = @_;
$self->$next( "Modified: $bar" );
};
И да, работа напрямую с хеш-значениями считается плохой практикой.
Также, пожалуйста, не думайте, что представленный мной вариант обязательно правильный. Использование подтипов и принуждения будет правильным решением в большинстве случаев - если вы подумаете о своем параметре с точки зрения типа, который может быть повторно использован во всем приложении, это приведет к гораздо лучшему дизайну, чем произвольные модификации, которые могут быть сделано с использованием «вокруг». См. Ответ @daotoad.
Я думаю, используя хэш ссылка подходит для триггера следующим образом:
package Foo;
use Moose;
has 'bar' => (
isa => 'Str',
is => 'rw',
trigger => sub { $_[0]->{bar} = "modified: $_[1]" },
);
Триггер также срабатывает, когда bar arg передается с конструктором. Этого не произойдет, если вы определите свой собственный метод set_bar или с помощью модификатора метода.
re: hash reference - Обычно я считаю, что лучше всего придерживаться методов установки / получения атрибутов, если (как в случае с триггером выше) нет простого альтернатива.
Если работа с хешем напрямую вызывает у вас беспокойство, вы можете указать альтернативного писателя, а затем использовать его из своего собственного «общедоступного» писателя с соответствующим именем.
package Foo;
use Moose;
has 'bar' => (
isa => 'Str',
reader => 'get_bar',
writer => '_set_bar',
);
sub set_bar {
my $self = shift;
my @args = @_;
# play with args;
return $self->_set_bar(@args);
}
Это или триггеры, может показаться мне хорошим подходом в зависимости от того, когда и как вам нужно манипулировать аргументами.
(отказ от ответственности: непроверенный код, написанный из памяти, просмотр SO на нетбуке с нестабильным доступом к краям)