module Effects def self.reverse lambda do |words| words.split(' ').map(&:reverse).join(' ') end end def self.echo(rate) lambda do |words| words.each_char.map { |c| c == ' ' ? c : c * rate }.join end end def self.loud(level) lambda do |words| words.split(' ').map { |word| word.upcase + '!' * level }.join(' ') end end end class WordSynth def initialize @effects = [] end def add_effect(effect) @effects << effect end def play(original_words) words = original_words @effects.each do |effect| words = effect.call(words) end words end end