def to_s(hash = {}, &block)
      return @headers.map { |header| header.to_s }.join("\n") if hash.empty? && !block_given?

      @headers.map do |header|
        if hash.has_key?(header.key)
          header.to_s(hash[header.key])
        else
          header.to_s(&block)
        end
      end.join("\n")
    end
def to_s(hash = {}, &block)
      return @headers.map { |header| header.to_s }.join("\n") if hash.empty? && !block_given?

      @headers.map do |header|
        if hash.has_key?(header.key)
          header.to_s(hash[header.key])
        else
          header.to_s(&block)
        end
      end.join("\n")
    end
Calls #to_s on each header in the set, joining the result with newlines.

 If _hash_ has a key matching a header in the set, passes the value for that key in the hash
 to Header#to_s. If _hash_ has no key for the header being iterated over, passes the given
 block to Header#to_s instead.