/**
  * Initialise the manifest
  */
 protected function init()
 {
     if ($data = $this->cache->load($this->cacheKey)) {
         $this->themes = $data;
     } else {
         $this->regenerate();
     }
 }
 public function handleFile($basename, $pathname, $depth)
 {
     if ($basename == self::CONF_FILE) {
         $this->configs[] = $pathname;
         return;
     }
     $classes = null;
     $interfaces = null;
     $namespace = null;
     $imports = null;
     $traits = null;
     // The results of individual file parses are cached, since only a few
     // files will have changed and TokenisedRegularExpression is quite
     // slow. A combination of the file name and file contents hash are used,
     // since just using the datetime lead to problems with upgrading.
     $key = preg_replace('/[^a-zA-Z0-9_]/', '_', $basename) . '_' . md5_file($pathname);
     $valid = false;
     if ($data = $this->cache->load($key)) {
         $valid = isset($data['classes']) && is_array($data['classes']) && isset($data['interfaces']) && is_array($data['interfaces']) && isset($data['namespace']) && is_string($data['namespace']) && isset($data['imports']) && is_array($data['imports']) && isset($data['traits']) && is_array($data['traits']);
         if ($valid) {
             $classes = $data['classes'];
             $interfaces = $data['interfaces'];
             $namespace = $data['namespace'];
             $imports = $data['imports'];
             $traits = $data['traits'];
         }
     }
     if (!$valid) {
         $tokens = token_get_all(file_get_contents($pathname));
         $classes = self::get_namespaced_class_parser()->findAll($tokens);
         $traits = self::get_trait_parser()->findAll($tokens);
         $namespace = self::get_namespace_parser()->findAll($tokens);
         if ($namespace) {
             $namespace = implode('', $namespace[0]['namespaceName']);
         } else {
             $namespace = '';
         }
         $imports = $this->getImportsFromTokens($tokens);
         $interfaces = self::get_interface_parser()->findAll($tokens);
         $cache = array('classes' => $classes, 'interfaces' => $interfaces, 'namespace' => $namespace, 'imports' => $imports, 'traits' => $traits);
         $this->cache->save($cache, $key);
     }
     // Ensure namespace has no trailing slash, and namespaceBase does
     $namespaceBase = '';
     if ($namespace) {
         $namespace = rtrim($namespace, '\\');
         $namespaceBase = $namespace . '\\';
     }
     foreach ($classes as $class) {
         $name = $namespaceBase . $class['className'];
         $extends = isset($class['extends']) ? implode('', $class['extends']) : null;
         $implements = isset($class['interfaces']) ? $class['interfaces'] : null;
         if ($extends) {
             $extends = $this->findClassOrInterfaceFromCandidateImports($extends, $namespace, $imports);
         }
         if (!empty($implements)) {
             //join all the tokens
             $implements = implode('', $implements);
             //split at comma
             $implements = explode(',', $implements);
             //normalise interfaces
             foreach ($implements as &$interface) {
                 $interface = $this->findClassOrInterfaceFromCandidateImports($interface, $namespace, $imports);
             }
             //release the var name
             unset($interface);
         }
         $lowercaseName = strtolower($name);
         if (array_key_exists($lowercaseName, $this->classes)) {
             throw new Exception(sprintf('There are two files containing the "%s" class: "%s" and "%s"', $name, $this->classes[$lowercaseName], $pathname));
         }
         $this->classes[$lowercaseName] = $pathname;
         if ($extends) {
             $extends = strtolower($extends);
             if (!isset($this->children[$extends])) {
                 $this->children[$extends] = array($name);
             } else {
                 $this->children[$extends][] = $name;
             }
         } else {
             $this->roots[] = $name;
         }
         if ($implements) {
             foreach ($implements as $interface) {
                 $interface = strtolower($interface);
                 if (!isset($this->implementors[$interface])) {
                     $this->implementors[$interface] = array($name);
                 } else {
                     $this->implementors[$interface][] = $name;
                 }
             }
         }
     }
     foreach ($interfaces as $interface) {
         $this->interfaces[strtolower($namespaceBase . $interface['interfaceName'])] = $pathname;
     }
     foreach ($traits as $trait) {
         $this->traits[strtolower($namespaceBase . $trait['traitName'])] = $pathname;
     }
 }