Вы можете сохранить исходный метод как объект несвязанного метода вместо сохранения его в псевдониме.
Затем вы можете использовать define_method
с блоком. Блок будет захватывать несвязанный method_object в замыкании, что позволит вам использовать его в новом методе, не загрязняя ваш модуль / класс.
Единственным недостатком является то, что вы, вероятно, не можете определить метод, который уступает или принимает блок следующим образом:
module Mod
unbound_method = instance_method(:original_method)
define_method :original_method do |*args|
#do something before
#call the original method
unbound_method.bind(self).call(*args)
#do something after
end
end