Vous pouvez faire cela très facile avec le Docile gem, soit par l'utilisation de la gemme, ou en lisant le code source afin de comprendre comment il fonctionne.
Imaginons que vous vouliez faire une Pizza via une connexion DSL
Pizza = Struct.new(:cheese, :pepperoni, :bacon, :sauce)
Et vous utilisez un générateur de motif pour faire la Pizza
class PizzaBuilder
def cheese(v=true); @cheese = v; end
def pepperoni(v=true); @pepperoni = v; end
def bacon(v=true); @bacon = v; end
def sauce(v=nil); @sauce = v; end
def build
Pizza.new(!!@cheese, !!@pepperoni, !!@bacon, @sauce)
end
end
Et vous voulez un DSL, dire quelque chose comme
@sauce = :extra
pizza do
bacon
cheese
sauce @sauce
end
# => should return Pizza.new(true, false, true, :extra)
Tout ce que vous avez à faire est de définir la pizza de la méthode d'
require 'docile'
def pizza(&block)
Docile.dsl_eval(PizzaBuilder.new, &block).build
end
Et d'un coup, vous avez terminé.