# File lib/structured_warnings/warning.rb, line 39
  def warn(*args)
    first = args.shift
    if first.is_a? Class and first <= StructuredWarnings::Base
      warning = first
      message = args.shift

    elsif first.is_a? StructuredWarnings::Base
      warning = first.class
      message = first.message

    else
      warning =
        if caller.shift.include? 'lib/structured_warnings/kernel.rb'
          StructuredWarnings::StandardWarning
        else
          StructuredWarnings::BuiltInWarning
        end
      message = first.to_s
    end

    # If args is not empty, user passed an incompatible set of arguments.
    # Maybe somebody else is overriding warn as well and knows, what to do.
    # Better do nothing in this case. See #5
    return super unless args.empty?

    if warning.active?
      output = StructuredWarnings.warner.format(warning, message, caller(1))
      super(output) unless output.nil? or output.to_s.empty?
    end
  end