如何在运行时更改Moose类的重载运算符?

时间:2014-07-06 19:42:23

标签: perl moose

我有一个带有重载字符串化运算符的Moose类,我实际上想在运行时更改它,因为我需要以不同格式输出文本。

换句话说,我希望能够做到这样的事情:

$obj = Class->new("a'");
$obj->formatter("A::Formatter");
print "$obj";

# prints "a'"

$obj->formatter("Another::Formatter");
print "$obj";

# prints a1

我还希望格式化程序是模块化的,这样我就可以封装和插入不同的格式化程序,而不会产生巨大的意大利面。

我该如何做到最好?角色是解决这类问题的好方法吗?我已经检查了MooseX::Object::PluggableMooseX::Traits::PluggableMooseX::Traits,但需要建议,因为这对我来说是一个未知领域。

1 个答案:

答案 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);
}