/**
* @param string $namespace
* The namespace in this element's scope
*
* @param string $name
* The name of this structural element
*
* @param int $alternate_id
* An alternate ID for the elemnet for use when
* there are multiple definitions of the element
*/
protected function __construct(string $namespace, string $name, int $alternate_id = 0)
{
assert(!empty($name), "The name cannot be empty");
assert(!empty($namespace), "The namespace cannot be empty");
assert($namespace[0] === '\\', "The first character of a namespace must be \\, but got {$namespace}");
parent::__construct($name);
$this->namespace = $namespace;
$this->alternate_id = $alternate_id;
}