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