private function _parseFile($filename)
 {
     echo "Opening {$filename} <br>";
     $data = file_get_contents($filename);
     $tokenizer = new App_Tokenizer();
     $tokenizer->parse($data);
     $tokens = $tokenizer->getTokenData();
     $fileData = array('classes' => array(), 'requires' => array(), 'interfaces' => array());
     $lastClass = '';
     $docBlock = array();
     foreach ($tokens as $token) {
         switch ($token['token']) {
             case T_REQUIRE:
             case T_REQUIRE_ONCE:
                 $requiredFile = trim($token['data'], '\'"');
                 if (!in_array($requiredFile, $fileData['requires'])) {
                     $fileData['requires'][] = str_replace($this->_stripFromPath, '', $requiredFile);
                 }
                 break;
             case T_DOC_COMMENT:
                 $docBlock = array();
                 $matches = array();
                 preg_match('/@package\\s+(.*)/', $token['data'], $matches);
                 if (count($matches) == 2) {
                     $docBlock['package'] = $matches[1];
                 }
                 preg_match('/@subpackage\\s+(.*)/', $token['data'], $matches);
                 if (count($matches) == 2) {
                     $docBlock['subpackage'] = $matches[1];
                 }
                 break;
             case T_CLASS:
                 $fileData['classes'][$token['data']] = array('extends' => '', 'implements' => array(), 'docBlock' => $docBlock);
                 $lastClass = $token['data'];
                 break;
             case T_INTERFACE:
                 $fileData['interfaces'][] = $token['data'];
                 break;
             case T_EXTENDS:
                 if ($lastClass == '') {
                     throw new Exception('Extends can not come before any class declarations!');
                 }
                 $fileData['classes'][$lastClass]['extends'] = $token['data'];
                 break;
             case T_IMPLEMENTS:
                 if ($lastClass == '') {
                     throw new Exception('Implements can not come before any class declarations!');
                 }
                 $fileData['classes'][$lastClass]['implements'][] = $token['data'];
                 break;
         }
     }
     $this->_files[str_replace($this->_stripFromPath, '', $filename)] = $fileData;
 }
 private function _parseFile($filename)
 {
     echo "Opening {$filename} <br>";
     flush();
     $data = file_get_contents($filename);
     $tokenizer = new App_Tokenizer();
     $tokenizer->parse($data);
     $tokens = $tokenizer->getTokenData();
     $fileData = array('classes' => array(), 'requires' => array(), 'interfaces' => array());
     $lastClass = '';
     foreach ($tokens as $token) {
         switch ($token['token']) {
             case T_REQUIRE:
             case T_REQUIRE_ONCE:
                 $requiredFile = trim($token['data'], '\'"');
                 if (!in_array($requiredFile, $fileData['requires'])) {
                     $fileData['requires'][] = $requiredFile;
                 }
                 break;
             case T_CLASS:
                 $fileData['classes'][$token['data']] = array('extends' => '', 'implements' => array());
                 $lastClass = $token['data'];
                 break;
             case T_INTERFACE:
                 $fileData['interfaces'][] = $token['data'];
                 break;
             case T_EXTENDS:
                 if ($lastClass == '') {
                     throw new Exception('Extends can not come before any class declarations!');
                 }
                 $fileData['classes'][$lastClass]['extends'] = $token['data'];
                 break;
             case T_IMPLEMENTS:
                 if ($lastClass == '') {
                     throw new Exception('Implements can not come before any class declarations!');
                 }
                 $fileData['classes'][$lastClass]['implements'][] = $token['data'];
                 break;
         }
     }
     return $fileData;
 }