# from http://liquiddevelopment.blogspot.com/2006/04/way-of-meta-part-iv-hijacking-local.html def report recipe, ingredients puts "to make #{recipe} you should buy:" ingredients.each_pair do |ingredient,description| puts " * #{Array(description).join ' '} #{ingredient}" end puts end def shopping_list recipe shopping_binding = yield ingredients = {} eval("local_variables" , shopping_binding). each do |var| ingredients[var] = eval "#{var}" , shopping_binding end report recipe, ingredients end alias the binding shopping_list "english breakfast" do tomatoes = 2, :green sausages = 3 eggs = 2, :big bacon = 4 the end # returns binding shopping_list "banana milkshake" do milk = 1 bananas = 2 the end