/**
  * @param array $namespace
  * @param string $name
  *
  * @return Definition
  */
 public function fetch(array $namespace, $name)
 {
     if ($name[0] == '.') {
         $lookup = new Definition($this->getFQN($namespace, $name));
         if (isset($this->definitions[$lookup->getQualifiedName()])) {
             return $this->definitions[$lookup->getQualifiedName()];
         }
     } else {
         $fqn = $this->getFQN($namespace, $name);
         $name = array_pop($fqn);
         for ($depth = count($fqn); $depth >= 0; $depth--) {
             $lookup = new Definition(array_merge(array_slice($fqn, 0, $depth), [$name]));
             if (isset($this->definitions[$lookup->getQualifiedName()])) {
                 return $this->definitions[$lookup->getQualifiedName()];
             }
         }
     }
     throw new ParseException("Unable to resolve {$name} within '" . implode('.', $namespace) . "' or its parents. Defined symbols are: \n" . implode("\n", array_keys($this->definitions)));
 }