module RbDec

Pythonのデコレーター機能をRubyでの実現を試みる

Constants

VERSION

Public Instance Methods

decorate(name, param = nil, before_dec: nil, after_dec: nil) click to toggle source
Calls superclass method
# File lib/rbdec.rb, line 7
def decorate(name, param = nil, before_dec: nil, after_dec: nil)
  to_prepend = Module.new do
    define_method(name) do |*t_param, &t_block|
      # -- Before --
      if before_dec.respond_to?('call')
        status, result, r_param, r_block = before_dec.call(param, *t_param, &t_block)
      else
        status, result, r_param, r_block = true, nil, t_param, t_block
      end
      # -- Call --
      if status
        res = super(*r_param, &r_block)
      else
        res = result
      end
      # -- After --
      if after_dec.respond_to?('call')
        after_dec.call(res, param, *t_param, &t_block)
      else
        res
      end
    end
  end
  prepend to_prepend
end