Я хочу изменить значение атрибута каждый раз, когда оно установлено, независимо от того, выполнено оно внутри конструктора или «писателем» (я не использую «строитель» или «по умолчанию» в этом случае). В основном атрибут (необязательный тип «Str») передается конструктору, и в некоторых случаях я хочу изменить его значение после этого, но в каждом сценарии я хочу сделать некоторое регулярное выражение на нем (например).Принудительное принуждение в Moose
Мой первый подход состоял в том, чтобы использовать метод BUILDARGS и around, оба из которых будут использовать одну и ту же функцию регулярного выражения, но тогда я задаюсь вопросом о принуждении. Единственная проблема заключается в том, что я не знаю, как создать определение подтипа/типа, которое будет принудительным принуждением независимо от того, что.
Например:
package Foo;
use Moose::Util::TypeConstraints;
subtype 'Foo::bar' => as 'Str';
coerce 'Foo::bar'
=> from 'Str'
=> via {
$_ =~ s/some_stuff//g;
$_ =~ s/other_stuff//g;
$_ =~ s/some_other_stuff//g;
};
has 'bar' => (isa => 'Foo:bar', coerce => 1);
Я не хочу, чтобы определить подтип/типа с 'где' п как
subtype 'Foo::bar' => as 'Str' => where {$_ !~ /some_stuff/ && $_ !~ /other_stuff/ && ... };
, потому что кажется утомительным для меня.
Редактировать: Я ищу для комплексного решения я мог бы использовать не только с атрибутами типа «ул», но также «ссылку на массив», «HashRef» и т.д.
Вы говорите, что принуждение не всегда происходит? В какой ситуации значение не принуждено? – ikegami
@ikegami Foo-> new (bar => 'Some string') Принуждение не произойдет, потому что прошедшее значение уже является строкой. «Принуждение позволяет вам указывать Moose для автоматического преобразования одного типа в другой», и оба типа ввода и вывода являются строкой. Я не настаиваю на использовании этого метода, просто ищу лучший вариант. – roland16
Значит, вы говорите, что принуждения никогда не происходит? Пожалуйста, уточните, в чем проблема. По крайней мере, продемонстрируйте это! – ikegami