1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Object
  def self.once(sym)
    alias_method sym.to_s + "_orig", sym
    
    define_method sym do |*args|
      
      @values ||= {}
      if @values.has_key? sym
        return @values[sym]
      else
        value = self.send("#{sym.to_s}_orig", *args)
        @values[sym] = value
        return value
      end
    end
  end
end

class Example
  
  def m
    rand
  end
  once :m
  
  def m2(foo)
    return "#{foo}"
  end
  once :m2
end

e = Example.new
e2 = Example.new
puts e.m
puts e2.m
puts e.m
puts e2.m
puts e2.m
puts e2.m

puts e.m2("hej")
puts e2.m2("warez")
puts e.m2("uv")
puts e2.m2("fluff")