Можно сделать кеширование.
Заменив, p «before ##{name}» на запрос в мемкеш и выдачу результата оттуда, а p «after ##{name}» заменить на кеширование результата в мемкеш.
Это не метапрограммирование. Вот если бы в method_missing на объекте создавался метод, дабы исключить обработку в method_missing при повторном вызове, тогда да.
Код по сути есть «сферический конь в вакууме», т.к. для запуска в тредах и «померить производительность» проксирование не нужно, для «навесить фильтры до и после» — есть alias'инг или (в рельсах) alias_method_chain. Имхо более жизненный пример с проксированием – это коллекции объектов, возвращаемые в рельсовских ActiveRecord при вызове find.
Есть сотни способов, как заальясить одно в другое и обернуть, еще раз я показал пример, как можно сделать обертку, для всех! методов класса, а не для одного.
Если я правильно понял, тут просто используется спец-метод method_missing, вызывающийся, если запрашиваемый метод не был найден, так?
В питоне это можно сделать почти так же, через __getattribute__ (вызывается для всех свойств и методов, не только для отсутствующих).
А правильный способ — декораторы, что есть синтаксический сахар, но очень удобно и без лишнего кода.
Вообще, суть декораторов, как раз-таки, в проксировании (аспектно-ориентированное программирование) В то время как основная задача method_missing — определение действия на случай, если объект не может сам ответить на сообщение. Но, как вариант, можно использовать method_missing для проксирования (что и делает автор статьи), но, повторю, основная идея — не в проксировании. Проксирующие же декораторы (в Питоне) вызываются всегда, независимо от того, есть такой атрибут у объекта или нет.
Да, только в случае декораторов мы можем каждому методу навесить разные прокси (включая несколько декораторов для одного метода), тогда как при использование method_missing — у нас один «декоратор» на всех (можно, конечно, сделать проверку имени метода, и вызывать разные соответствующее действия, но это будет громоздко). Всё же, если говорить о декораторах, то здесь больше подойдёт паттерн alias_method_chain.
> Я так понимаю он реализован только в рельсах и с наскока его не перенесешь к себе.
Да, он реализован в Рельсах. Но почему не «перенесёшь к себе»? Ведь это обычная цепочка вызовов заaliasенных методов (через стандартные конструкции alias и alias_method) — можно и свою идеологию придумать (не только с with и without, как придумали в alias_method_chain, который имитирует работу декораторов).
Ruby — проксирование методов класса