class Preq def initialize( obj, &blk ) @obj = obj @cache = {} instance_eval &blk end def method_missing( meth, *args, &blk ) (class << self; self; end).instance_eval { define_method( meth ) do @cache[meth] ||= @obj.send( meth, *args, &blk ) end } send( meth, *args, &blk ) end end class X def initialize ; @n = 0 ; end def y ; @n += 1 ; end def s ; @n ; end def z ; y ; end end x = X.new Preq.new(x) do y ; y ; z ; y end p x.s