module FunSwap

Public Class Methods

swap(mod, fn_name, fn) click to toggle source

Swap module function in method and return the old function.

mod:module -> fn_name:symbol -> fn:proc -> old_fn:proc

# File lib/funswap.rb, line 7
def self.swap(mod, fn_name, fn)
  old_fn = mod.method(fn_name).to_proc
  begin
    eigenclass = class << mod; self; end
    eigenclass.class_eval { remove_method fn_name }
  rescue NameError
  end
  mod.class.send(:define_method, fn_name, fn)
  old_fn
end
with_fn(mod, fn_name, fn, &blk) click to toggle source
# File lib/funswap.rb, line 18
def self.with_fn(mod, fn_name, fn, &blk)
  old_fn = swap(mod, fn_name, fn)
  blk.call()
ensure
  swap(mod, fn_name, old_fn)
end