public function render()
 {
     $editor = new OpenInEditor();
     $structure = (object) array('structure' => array());
     $isAll = true;
     foreach (Finder::findFiles('*Test.php')->from($this->dir) as $file) {
         $relative = substr($file, strlen($this->dir) + 1);
         $cursor =& $structure;
         foreach (explode(DIRECTORY_SEPARATOR, $relative) as $d) {
             $r = isset($cursor->relative) ? $cursor->relative . DIRECTORY_SEPARATOR : NULL;
             $cursor =& $cursor->structure[$d];
             $path = $this->dir . DIRECTORY_SEPARATOR . $r . $d;
             $open = $path === $this->open;
             if ($open) {
                 $isAll = false;
             }
             $cursor = (object) array('relative' => $r . $d, 'name' => $d, 'open' => $open, 'structure' => isset($cursor->structure) ? $cursor->structure : array(), 'editor' => $editor->link($path, 1), 'mode' => is_file($path) ? 'file' : 'folder');
             if (!$cursor->structure and $cursor->mode === 'file') {
                 foreach ($this->loadMethod($path) as $l => $m) {
                     $cursor->structure[$m] = (object) array('relative' => $cursor->relative . '::' . $m, 'name' => $m, 'open' => $cursor->open and $this->method === $m, 'structure' => array(), 'editor' => $editor->link($path, $l), 'mode' => 'method');
                 }
             }
         }
         $cursor->name = $file->getBasename();
     }
     $this->template->isAll = ($isAll and $this->open !== false);
     $this->template->basePath = TemplateFactory::getBasePath();
     $this->template->structure = $structure->structure;
     $this->template->setFile(__DIR__ . '/StructureRenderer.latte');
     $this->template->render();
 }
 /**
  * @see OpenInEditor
  * @param string
  * @param Exception
  * @return string|NULL
  */
 private function getEditorLink($path, Exception $e, $method)
 {
     if ($e->getFile() === $path) {
         return $this->editor->link($path, $e->getLine());
     }
     $last = $first = NULL;
     foreach ($e->getTrace() as $trace) {
         if ($first === NULL and isset($trace['file']) and $trace['file'] === $path) {
             $first = $this->editor->link($path, $trace['line']);
         }
         if ($trace['function'] === $method and isset($last['file']) and $last['file'] === $path) {
             return $this->editor->link($path, $last['line']);
         }
         $last = $trace;
     }
     if ($first !== NULL) {
         return $first;
     }
     if (is_file($path)) {
         $tmp = preg_grep('#function\\s+' . preg_quote($method) . '\\s*\\(#si', explode("\n", file_get_contents($path)));
         if ($tmp) {
             return $this->editor->link($path, key($tmp) + 1);
         }
     }
     return $this->editor->link($path, 1);
 }