#perl #moose
#perl — язык программирования #moose #perl
Вопрос:
У меня есть класс Moose с перегруженным оператором stringification, который я действительно хотел бы изменить во время выполнения, потому что мне нужен вывод текста в разных форматах.
Другими словами, я хотел бы иметь возможность делать что-то вроде этого:
$obj = Class->new("a'");
$obj->formatter("A::Formatter");
print "$obj";
# prints "a'"
$obj->formatter("Another::Formatter");
print "$obj";
# prints a1
Я бы также хотел, чтобы форматеры были модульными, чтобы я мог инкапсулировать и подключать разные, не создавая гигантской путаницы из спагетти.
Как мне лучше всего это сделать? являются ли роли хорошим решением для такого рода проблем? Для начала я проверил MooseX::Object::Pluggable, MooseX::Traits::Pluggable и MooseX::Traits, но нуждаюсь в совете, поскольку для меня это неизведанная территория.
Ответ №1:
Вам не нужно изменять перегрузку во время выполнения, просто то, как это реализовано. Помните, перегрузка может быть выполнена с помощью имени метода, а не вложенной ссылки:
package Foo;
use Moose;
use overload q{""} => '_stringify';
has id => (
is => 'ro',
isa => 'Str',
required => 1,
);
has formatter_class => (
is => 'rw',
isa => 'ClassName',
required => 1,
);
sub _stringify {
my $self = shift;
return $self->formatter_class()->new()->format($self);
}