protected function fetchDescription() {
		$url = $this->uri;
		
		if($this->version)
			$url .= "/v".$this->version."/";
		
		$request = $this->getRequest('options', $url);
		
		if(!$this->version)
			$this->queryParams['describe'] = 'default';
		
		$this->authProvider->authenticate($request);
		
		$ret = $this->sendRequest($request)->body;

		if (!isset($ret->version)) {
			throw new Client\Exception\ProtocolError(
				"Incompatible protocol version: the client uses v".self::PROTOCOL_VERSION.
				" while the API server uses an unspecified version (pre 1.0)"
			);
		}

		$this->protocol_version = $ret->version;

		if ($ret->version == self::PROTOCOL_VERSION)
			return $ret->response;

		list($major1, $minor1) = explode('.', $ret->version);
		list($major2, $minor2) = explode('.', self::PROTOCOL_VERSION);

		if ($major1 != $major2) {
			throw new Client\Exception\ProtocolError(
				"Incompatible protocol version: the client uses v".self::PROTOCOL_VERSION.
				" while the API server uses v".$ret->version
			);
		}
		
		// $minor1 != $minor2 - imperfect compatibility
		
		return $ret->response;
	}