class Converter def initialize @specs = [] end def specs( value , &cond ) @specs << lambda { |e| cond[e] ? value : nil } end def to_proc lambda { |e| conved = @specs.map{ |spec| spec[e] }.join conved.empty? ? e : conved } end end if __FILE__ == $0 arg = ARGV[0] || 100 limit = arg.to_i fizzbuzz = Converter.new fizzbuzz.specs( "Fizz" ) { |n| n % 3 == 0 } fizzbuzz.specs( "Buzz" ) { |n| n % 5 == 0 } puts 1.upto(limit).map(&fizzbuzz) end