memo Ruby

書いてみたが、まずい。今イチ

class Part
  attr_accessor :name
  attr_reader :parts
  
  def initialize name
    @name = name
    @parts = {}
  end
  
  def add child
    @parts[child.name] = child
    self.instance_eval(%{
       def #{child.name}
        @parts["#{child.name}"]
       end})
  end
  
  
  def add_parts(&block)
    instance_exec(self, &block) if block_given?
  end

  def method_missing(action, *args, &block)
    eval %{
      part = Part.new("#{args[0]}")
      self.add part
      part.add_parts &block
    }    
  end
  
end

class PCBuilder    
  def build(&block)
    @pc = Part.new("pc")
    @pc.add_parts(&block)
    return @pc
  end
end


pc_builder = PCBuilder.new

pc = pc_builder.build do |p|
  p.board "my_board" do |b|
    b.cpu "my_cpu_a"
    b.cpu "my_cpu_b"
  end
  p.cover "my_cover"
end

require "pp"

puts "=---"
pp pc
puts pc.my_board.name
puts pc.my_board.my_cpu_a.name
puts pc.my_board.my_cpu_b.name
puts pc.my_cover.name