From: lith Date: 2009-07-13T02:49:55+09:00 Subject: Re: Prototype-Based Inheritance (#214) >     pele = {:name => "Pele", :sport => "football", :position => "Forward"} >     pele_jr = {:name => "Pele Jr."} >     pele_jr.prototype = pele >     pele_jr.name # => "Pele Jr." >     pele_jr.sport # => "football" >     pele_jr.position # => "forward" What about: class Hash def prototype=(prototype) merge!(prototype) {|k,o,n| o} end def method_missing(name, *args, &block) if has_key?(name) val = fetch(name) case val when Proc return val.call(self, *args) end end if name.to_s =~ /^(.*?)=$/ meth = :[]= name = $1.intern else meth = :[] end margs = [name, *args] margs << block if block send(meth, *margs) end end This would allow you to do something like: pele_jr.age = 20 pele_jr.foo = lambda {|this, a| this.age + a} pele_jr.foo(10) #=> 30