public function getObject(IRI $coid) {
		if (!COIDParser::isValidCOID($coid))
			throw new \Exception("Not a valid COID.");

		$uriString = (string)$coid;

		if (isset($this->objects[$uriString]))
			// Return from in-memory cache if it exists
			return $this->objects[$uriString];

		$ts = microtime(true);

		if (isset($this->options['static_config_path'])) {
			$location = realpath($this->options['static_config_path'].DIRECTORY_SEPARATOR.
				$coid->getHost().str_replace('/', DIRECTORY_SEPARATOR, $coid->getPath())
				.DIRECTORY_SEPARATOR.'object.jsonld');

			if ($location && file_exists($location)) {
				$object = $location;
				$this->logInfoWithTime('Fetched <'.$uriString.'> from static configuration.', $ts);
			}
		}

		if (!isset($object)) {
			$object = $this->getFromCache($uriString);
			if (isset($object))
				$this->logInfoWithTime('Fetched <'.$uriString.'> from object cache.', $ts);
		}

		if (!isset($object)) {
			try {
				$response = $this->client
					->get((isset($this->prefix) ? $this->prefix : '').$coid->getHost().$coid->getPath().'/object',
						['headers' => ['Accept' => 'application/ld+json']]);

				$object = (string)$response->getBody();
				$this->putIntoCache($uriString, $object, $this->options['cache_ttl']);
				$this->logInfoWithTime('Fetched <'.$uriString.'> from Core API ['.$response->getStatusCode().'].', $ts);
			} catch (\Exception $e) {
				$this->logInfoWithTime('Object <'.$uriString.'> not found in Core API ['.$e->getResponse()->getStatusCode().'].', $ts);
				return null;
			}
		}

		$document = JsonLD::getDocument($object);
		$this->objects[$uriString] = $document->getGraph()->getNode($uriString);
		return $this->objects[$uriString];
	}