Как я могу изменить перегруженный оператор в классе Moose во время выполнения?

#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);
}