我有一个带有重载字符串化运算符的Moose类,我实际上想在运行时更改它,因为我需要以不同格式输出文本。
换句话说,我希望能够做到这样的事情:
$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,但需要建议,因为这对我来说是一个未知领域。
答案 0 :(得分:3)
您无需在运行时更改重载,只需更改它的实现方式。请记住,重载可以使用方法 name 而不是subref:
完成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);
}