Это возможно, хотя вы, вероятно, столкнетесь с практическими проблемами, которые потребуют дополнительных усилий.Вызов логики построения - хороший пример, уже упомянутый в комментарии.Кроме того, ожидается, что все успешно проверит проверку типа 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
реализации.