3

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

4

2 回答 2

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

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

我更倾向于编写一个参数收集器(我把它大写,就像它是一种模式,但我在文献中没有看到它),它有一个优化的界面来收集创建事物所需的信息,以及事物它本身,它是程序其余部分使用的对象。

于 2012-06-04T10:16:34.950 回答
0

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

对所有属性使用“之前”修饰符是显而易见的方法。我确信有一种合适的元编程方式来获取所有属性访问器的列表并应用修饰符,但我很想用一个大注释明确列出它们。

你有没有考虑过你这里是一门课还是两门课(Thingy,LockedThingy)?如果您愿意,两个类可以让您封装元智能。

于 2012-05-28T06:20:08.210 回答