当Moose中的基础属性发生变化时,重建延迟构建的属性

fri*_*edo 5 perl moose traits lazy-evaluation

我有一个lazy_build属性的Moose类.该属性的值是另一个(非惰性)属性的函数.

假设某人为所需属性实例化了值为42的类.然后他们请求延迟属性,该属性计算为42的函数.然后,他们有勇气改变第一个属性!

懒惰的已经构建,因此不会再次调用构建器,并且lazy属性现在已过时.

我现在有一个解决方案,我在必需的属性上维护一个"脏"标志,懒惰的访问器检查脏标志并在需要时重建它.

但是,这似乎很多工作.有没有办法在Moose中处理这个问题,例如使用特征?

rjh*_*rjh 9

我的典型解决方案

has 'attr1' => (
    ...
    trigger => \&clear_attr2, 
);
Run Code Online (Sandbox Code Playgroud)

即当更新attr1时,attr2将被清除,并在下次访问时重建.clear_attr2你使用时免费提供lazy_build.只要使用访问器方法,就不需要"脏"标志.

这是一种常见的模式 - 处理'派生'属性的某种特性会很好.