通常,我使用保存对象集合的Perl / Moose属性。我知道可以监视整个属性是否已设置。在这种情况下,可以使用trigger。这样还可以监视属性中的对象。但是如何监视收藏?如果属性为-例如-对象数组,是否可以监视是否添加了对象?
我要寻找的是一种method modifier,例如“ before”或“ around”,用于在属性上调用诸如push或shift之类的内置函数时。这将为非常通用的解决方案提供解决方案,例如仅在发生更改时保存。
答案 0 :(得分:2)
像push
这样的操作不是在属性本身上执行的,而是在该属性所引用的数组对象上执行的。
因此,观察此类操作的唯一可靠方法是从该数组对象中进行–通过tie
将其分配到适当的类。但这是Perl的黑魔法,通常是不可取的(速度慢,难以正确执行,可能会暴露其他模块中的错误,并且级别很低)。
通常更好的方法是选择停止公开数组引用的设计。例如。您可以提供一种方法push @{ $foo->attribute }, 42
来代替$foo->push_attribute(42)
。通过这种方法,您可以实现所需的任何钩子。