使对象实例不可变

时间:2012-05-28 00:09:42

标签: perl immutability moose

我希望能够实例化一个基于Moose的对象添加到它,直到我序列化它然后我想让它不可更改。我该怎么做/应该这样做?

2 个答案:

答案 0 :(得分:1)

我会做两个班级和一个共同的角色:

package Thing
use Moose::Role;

has some_attrib => (isa => 'AnotherThing');

### Behaviour (the important stuff) goes here

package ImmutableThing;
use Moose;

with 'Thing';

has +some_attrib => (is => 'ro');

sub finalize { shift }

package MutableThing
use Moose;

with 'Thing';

has +some_attrib => (is => 'rw');

sub finalize {
    my $self = shift;
    Thing->new({some_attrib => $self->some_attrib});
}

我不确定拥有相同类的可变和不可变形式是一个好主意。我倾向于尝试将构建时间和操作时间视为具有不同接口的两个不同阶段。

我更倾向于编写一个参数收集器(我已将其大写,就像它是一种模式,但我在文献中没有看到它),其接口已经过优化,可以收集创建Thing所需的信息,和Thing Itself,这是程序其余部分使用的对象。

答案 1 :(得分:0)

我不知道(并且不能轻易找到)在CPAN上执行此操作的任何模块,这是令人惊讶的,但解释了为什么要问: - )

对所有属性的“before”修饰符是显而易见的方法。我确信有一种合适的元编程方式可以获取所有属性访问器的列表并应用修饰符,但我很想明确地将它们全部列出来并附带一个大评论。

你有没有考虑过你是否有一两节课(Thingy,LockedThingy)?如果你倾向于这两种类,那么你可以将meta封装起来。