class DSLMenu attr_accessor :nombre, :platos, :menu def initialize(nombre, &block) @nombre = nombre @platos = [] @menu = [] if block_given? if block.arity == 1 yield self else instance_eval(&block) end end end def to_s output = "\n\n\n" + @nombre.upcase output << "\n#{'='*@nombre.size}\n\n " @menu.each do |menu| output << "#{menu}" end output << "\n\n" @platos.each_with_index do |plato, i| output << "[#{i + 1}] #{plato}\n" end output << "\n\n\n" output end def plato(nombre, opciones = {}) plato = nombre plato << "\n| contiene: #{opciones[:descripcion]} " if opciones[:descripcion] plato << " | valor nutricional: #{opciones[:nutricional]}" if opciones[:nutricional] plato << " | impacto ambiental: #{opciones[:ambiental]}" if opciones[:ambiental] plato << "\n\n #{opciones[:precio]} €\n" if opciones[:precio] @platos << plato end def menu(descripcion, opciones= {}) menu = descripcion menu << "\n#{'-'*descripcion.size}" menu << "\n\n #{opciones[:precio]} €" if opciones[:precio] @menu << menu end end combo1 = DSLMenu.new("Combinado nº 1") do menu "hamburguesa con queso, papas, refresco", :precio => 7.59 plato "hamburguesa especial de la casa", :descripcion => "carne de vaca, huevo, bacon, tomate, lechuga", :nutricional => "490 kcal", :ambiental => "170 gei 240 m²", :precio => 4.25 plato "papas fritas", :descripcion => "papas, aceite, sal", :nutricional => "570 kcal", :ambiental => "90 gei 130 m²", :precio => 1.75 plato "refresco", :nutricional => "120 kcal", :precio => 1.50 end puts combo1