# File lib/mongo/mongo_client.rb, line 564
    def setup(opts)
      @slave_ok = opts.delete(:slave_ok)

      @ssl = opts.delete(:ssl)
      @unix = @host ? @host.end_with?('.sock') : false

      if @ssl
        @socket_class = Mongo::SSLSocket
      elsif @unix
        @socket_class = Mongo::UNIXSocket
      else
        @socket_class = Mongo::TCPSocket
      end

      # Authentication objects
      @auths = opts.delete(:auths) || []

      # Pool size and timeout.
      @pool_size = opts.delete(:pool_size) || 1
      if opts[:timeout]
        warn "The :timeout option has been deprecated " +
          "and will be removed in the 2.0 release. Use :pool_timeout instead."
      end
      @pool_timeout = opts.delete(:pool_timeout) || opts.delete(:timeout) || 5.0

      # Timeout on socket read operation.
      @op_timeout = opts.delete(:op_timeout) || nil

      # Timeout on socket connect.
      @connect_timeout = opts.delete(:connect_timeout) || 30

      @logger = opts.delete(:logger) || nil

      if @logger
        write_logging_startup_message
      end

      # Determine read preference
      if defined?(@slave_ok) && (@slave_ok) || defined?(@read_secondary) && @read_secondary
        @read = :secondary_preferred
      else
        @read = opts.delete(:read) || :primary
      end
      Mongo::ReadPreference::validate(@read)

      @tag_sets = opts.delete(:tag_sets) || []
      @acceptable_latency = opts.delete(:secondary_acceptable_latency_ms) || 15

      # Connection level write concern options.
      @write_concern = get_write_concern(opts)

      connect if opts.fetch(:connect, true)
    end