public function addHost( Host $host )
	{
		$host_name = $host->getHostName();
		if( $this->offsetExists($host_name) ) throw new \InvalidArgumentException("Duplicate host {$host_name}");

		foreach( $this->hosts as $h )
		{
			// check WWW duplicate name
			if($h->isWww() && ("www." . $h->getHostName()) === $host_name)
				throw new \InvalidArgumentException("Duplicate host {$host_name}");

			// remove aliases and redirect from other hosts
			if($h->inAlias($host_name) || $h->inRedirect($host_name))
				$h->removeAlias($host_name);
		}

		// check duplicate names
		foreach( $host->getAliases() as $alias ) $this->throwAlias($alias, $host_name);
		foreach( $host->getRedirect() as $redirect ) $this->throwAlias($redirect, $host_name);

		$host->addInvoker(function($type, $value) use($host_name) {
			switch($type)
			{
				case "alias":
				case "redirect": $this->throwAlias($value, $host_name); break;
			}
		});

		return $this;
	}