変数を代入すると、自動で特異メソッドを生成する

空っぽの場合に、Item クラスが入るは微妙かもしれないけれど。

class Item < Hash
  def method_missing(name, *argv)
    if name.to_s =~ /(.+?)=$/
      method_name = $1.to_sym
      value = argv[0]
    else
      method_name = name
      value = Item.new
    end

    self[method_name] = value

    self.instance_eval <<-EOD
      def #{method_name}
        self[:#{method_name}]
      end
      def #{method_name}=value
        self[:#{method_name}] = value
      end
    EOD

    __send__(method_name)
  end
end

require 'pp'

item = Item.new

puts "item.foo => #{item.foo}"             # => item.foo =>
puts "item.foo#class => #{item.foo.class}" # => item.foo#class => Item
item.foo = 100
puts "item.foo => #{item.foo}"             # => item.foo => 100

item.aaa.bbb = "ccc"
puts "item.aaa.bbb => #{item.aaa.bbb}"     # => item.aaa.bbb => ccc

pp item                                    # => {:aaa=>{:bbb=>"ccc"}, :foo=>100}