Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def self.cache(name, &p)
- raise "no block given" unless block_given?
- n, v = *((p.arity<0)? [-p.arity-1,true] : [p.arity,false])
- args = (('a'..'z').to_a[0,n]+(v ? ['*args']:[])).join(',')
- eval "define_method(:_#{name}) {|#{args}| p.call(#{args})}"
- eval "define_method(:#{name}) {|#{args}| (@cache ||= {})[[name,#{args}]] ||= _#{name}(#{args})}"
- eval "define_method(:#{name}!) {|#{args}| (@cache ||= {})[[name,#{args}]] = _#{name}(#{args})}"
- end
Add Comment
Please, Sign In to add comment