这是可能的,尽管您可能会遇到需要进一步努力的实际问题。调用构造逻辑是评论中已经指出的一个很好的例子。除此之外,一切都有望成功地对Mu
;进行类型检查。此类检查在大多数地方作为优化被省略,但在其他地方则不然,因此您可能会遇到各种类型检查失败。
除此之外,这里是如何做到这一点。首先,创建一个导出新元类型的模块class
。
class RootHOW is Metamodel::ClassHOW {
method has_default_parent_type(|) { False }
}
package EXPORTHOW {
constant class = RootHOW;
}
元模型首先必须以某种方式用于设置Mu
类型,因此在这里我们(ab)使用一种通常意味着“不,还没有默认父类型的机制,因为我们没有引导我们的对象模型那么远”。将其粘贴到一个模块中,例如调用Parentless
,然后可以这样做:
use Parentless;
class NotAMu {
method FALLBACK($name, |c) {
say "called $name with {c.perl}"
}
}
NotAMu.new
哪个输出:
called new with \()
如果您的目标只是拦截每个方法分派,那么有一种破坏性要小得多的方式不会弄乱类型系统。目前它需要一个禁用方法缓存发布的自定义元类:
class InterceptHOW is Metamodel::ClassHOW {
method publish_method_cache(|) { }
}
package EXPORTHOW {
constant class = InterceptHOW;
}
然后你可以写:
use InterceptAllTheMethods;
class InterceptThemAll {
method ^find_method(Mu $obj, Str $name) {
return -> | { say "calling $name" }
}
}
InterceptThemAll.new
请注意,与 不同的是FALLBACK
,这里您返回一个随后将被调用的代码对象。您也可以在元类中编写此find_method
实现,这可能是一个更好的因素;不知道手头的问题很难说。
这种方法不会导致与类型检查相关的问题,让您拦截每个方法调度,并且很容易查找类似的内容bless
并将其委托给Mu
实现。