method_missing

 class LogWapper
   def initialize target
     @target = target
   end
   def method_missing(method, *value)
     puts "before invoke #{method.id2name}"
     @target.__send__(method, *value)
     puts "after invoke #{method.id2name}"
   end
 end

 class Hoge
   def hogehoge
     puts "call hogehoge"
   end
 end
 
 class Fuga
   def fugafuga
     puts "call fugafuga"
   end
 end
 
 # ---- Main ---- #
 hoge = LogWapper.new(Hoge.new)
 fuga = LogWapper.new(Fuga.new)
 hoge.hogehoge
 fuga.fugafuga
before invoke hogehoge
call hogehoge
after invoke hogehoge
before invoke fugafuga
call fugafuga
after invoke fugafuga