# The very simple idea behind the Builder pattern is that you encapsulate object
# construction logic behind a class of its own. The builder class takes charge of
# assembling all the components of a complex object. Each builder has an interface
# that lets you specify the configuration of your new object step by step. In a
# sense, a builder is a sort of like a multipart new method, where objects are
# created in an extended process instead of all in one shot.

# Classes witch are used in builder
class Computer
  # Implementation
end

class TurboCPU
  # Implementation
end

class Drive
  # Implementation
end

# Builder
class ComputerBuilder
  attr_reader :computer

  def initialize
    @computer = Computer.new
  end

  def turbo(_has_turbo_cpu = true)
    computer.cpu = TurboCPU.new
  end

  def display=(display)
    computer.display = display
  end

  def memory_size=(size_in_mb)
    computer.memory_size = size_in_mb
  end

  def add_cd(writer = false)
    computer.drives << Drive.new(:cd, 760, writer)
  end

  def add_dvd(writer = false)
    computer.drives << Drive.new(:dvd, 4000, writer)
  end

  def add_hard_disk(size_in_mb)
    computer.drives << Drive.new(:hard_disk, size_in_mb, true)
  end
end

# Usage

computer_builder = ComputerBuilder.new

computer_builder.turbo false
computer_builder.display = 'Monitor'
computer_builder.add_dvd false
computer_builder.add_cd = false
computer_builder.memory_size = '12mb'

computer = computer_builder.computer
