def extract_formatter(formatter, &block)
      if formatter.is_a?(Symbol) || formatter.is_a?(String)
        Sapience.constantize_symbol(formatter, "Sapience::Formatters").new
      elsif formatter.is_a?(Hash) && !formatter.empty?
        fmt, options = formatter.first
        Sapience.constantize_symbol(fmt.to_sym, "Sapience::Formatters").new(options)
      elsif formatter.respond_to?(:call)
        formatter
      elsif block
        block
      elsif respond_to?(:call)
        self
      else
        default_formatter
      end
    end
def extract_formatter(formatter, &block)
      if formatter.is_a?(Symbol) || formatter.is_a?(String)
        Sapience.constantize_symbol(formatter, "Sapience::Formatters").new
      elsif formatter.is_a?(Hash) && !formatter.empty?
        fmt, options = formatter.first
        Sapience.constantize_symbol(fmt.to_sym, "Sapience::Formatters").new(options)
      elsif formatter.respond_to?(:call)
        formatter
      elsif block
        block
      elsif respond_to?(:call)
        self
      else
        default_formatter
      end
    end
Return formatter that responds to call
 Supports formatter supplied as:
 - Symbol
 - Hash ( Symbol => { options })
 - Instance of any of Sapience::Formatters
 - Proc
 - Any object that responds to :call
 - If none of the above apply, then the supplied block is returned as the formatter.
 - Otherwise an instance of the default formatter is returned.
 rubocop:disable CyclomaticComplexity, AbcSize, PerceivedComplexity