如何监控属性的变化? (与更改/of/属性相反)

How to monitor changes in an attribute? (as opposted to change /of/ the attribute)

我经常使用 Perl/Moose 属性来保存对象集合。我知道可以监视是否设置了整个属性。在这种情况下,可以使用 trigger。这也使得监视属性中的对象成为可能。但是如何监控集合呢?如果属性是 - 例如 - 对象数组,是否可以监视是否添加了对象?

我正在寻找的是一种 method modifier,例如 "before" 或 "around",用于在属性上调用内置函数(例如 push 或 shift)时.这将允许非常通用的解决方案,例如仅在有更改时才保存。

push这样的操作不是在属性本身上执行的,而是在该属性引用的数组对象上执行的。

因此,观察此类操作的唯一可靠方法是从该数组对象内部 - 通过 tie-ing 将其转换为适当的 class。但这是相当黑暗的 Perl 魔法,通常不可取(速度慢,难以正确执行,可能会暴露其他模块中的错误,并且级别非常低)。

通常更好的方法是选择停止公开数组引用的设计。例如。您可以提供一种方法 $foo->push_attribute(42) 而不是 push @{ $foo->attribute }, 42。在该方法中,您可以实现所需的任何挂钩。