public function makeAbsolute($base)
    {
        if (! is_object($base)) {
            $base = new self($base);
        }
        if ($this->getHost()) {
            $scheme   = $this->getScheme();
            $host     = $this->getHost();
            $port     = $this->getPort() ? ':' . $this->getPort() : '';
            $identity = $this->getIdentity() ? $this->getIdentity() . '@' : '';
            if (! $identity) {
                $identity = $base->getIdentity() ? $base->getIdentity() . '@' : '';
            }
        } else {
            $scheme   = $base->getScheme();
            $host     = $base->getHost();
            $port     = $base->getPort() ? ':' . $base->getPort() : '';
            $identity = $base->getIdentity() ? $base->getIdentity() . '@' : '';
        }
        $path     = $this->normalisePath($this->extractAbsolutePath($base));
        $encoded  = $this->getEncodedRequest();
        $fragment = $this->getFragment() ? '#' . $this->getFragment() : '';
        $coords   = $this->getX() === false ? '' : '?' . $this->getX() . ',' . $this->getY();

        return new self("$scheme://$identity$host$port$path$encoded$fragment$coords");
    }