# File lib/Dnsruby/Recursor.rb, line 313
    def query(name, type=Types.A, klass=Classes.IN, no_validation = false)
      # @TODO@ PROVIDE AN ASYNCHRONOUS SEND WHICH RETURNS MESSAGE WITH ERROR!!!
          
      # Make sure the hint servers are initialized.
      @@mutex.synchronize {
        self.hints=(Hash.new) unless @@hints
      }
      @resolver.recurse=(0)
      # Make sure the authority cache is clean.
      # It is only used to store A and AAAA records of
      # the suposedly authoritative name servers.
      # TTLs are respected
      @@mutex.synchronize {
        if (!@@zones_cache)
          Recursor.clear_caches(@resolver)
        end
      }

      # So we have normal hashes, but the array of addresses at the end is now an AddressCache
      # which respects the ttls of the A/AAAA records

      # Now see if we already know the zone in question
      # Otherwise, see if we know any of its parents (will know at least ".")
      known_zone, known_authorities = get_closest_known_zone_authorities_for(name) # ".", @hints if nothing else

      # Seed name servers with the closest known authority
      #      ret =  _dorecursion( name, type, klass, ".", @hints, 0)
      ret =  _dorecursion( name, type, klass, known_zone, known_authorities, 0, no_validation)
      Dnssec.validate(ret) if !no_validation
      #      print "\n\nRESPONSE:\n#{ret}\n"
      return ret
    end