class Arel::Visitors::Visitor

def visit(object, collector = nil)

def visit(object, collector = nil)
  dispatch_method = dispatch[object.class]
  if collector
    send dispatch_method, object, collector
  else
    send dispatch_method, object
  end
rescue NoMethodError => e
  raise e if respond_to?(dispatch_method, true)
  superklass = object.class.ancestors.find { |klass|
    respond_to?(dispatch[klass], true)
  }
  raise(TypeError, "Cannot visit #{object.class}") unless superklass
  dispatch[object.class] = dispatch[superklass]
  retry
end