def call_processors(processors, input)
      data = input[:data] || ""
      metadata = (input[:metadata] || {}).dup

      processors.reverse_each do |processor|
        result = call_processor(processor, input.merge(data: data, metadata: metadata))
        data = result.delete(:data)
        metadata.merge!(result)
      end

      metadata.merge(data: data)
    end
def call_processors(processors, input)
      data = input[:data] || ""
      metadata = (input[:metadata] || {}).dup

      processors.reverse_each do |processor|
        result = call_processor(processor, input.merge(data: data, metadata: metadata))
        data = result.delete(:data)
        metadata.merge!(result)
      end

      metadata.merge(data: data)
    end
Public: Invoke list of processors in right to left order.

 The right to left order processing mirrors standard function composition.
 Think about:

   bundle.call(uglify.call(coffee.call(input)))

 processors - Array of processor callables
 input - Hash of input data to pass to each processor

 Returns a Hash with :data and other processor metadata key/values.