/**
  * Renvoie le singleton
  *
  * @return CopixAutoloader Singleton
  */
 public static function getInstance()
 {
     if (!self::$_instance) {
         self::$_instance = new CopixAutoloader();
     }
     return self::$_instance;
 }
 /**
  * Inclusion de librairies Copix
  * @param	string	$pClassName le nom de la classe que l'on souhaites inclure
  * @return	boolean	le fichier est ou non connu
  * @see CopixAutoloader
  * @todo Zone, Services, HTMLHeader, Cache, ClassesFactory, I18N, EventNotifier, Db, DBQueryParam, DAOFactory, Auth, User, Log
  */
 public static function RequireClass($pClassName)
 {
     // Tente d'abord de déclencher un autoloading
     if (!class_exists($pClassName, true)) {
         // Essaie quand même de charger la classe
         // au cas où CopixAutoloader ne soit plus enregistré comme autoloader
         if (!CopixAutoloader::getInstance()->load($pClassName)) {
             throw new Exception("Class {$pClassName} not found");
         }
     }
 }
 /**
  * Réécriture du chemin des classes
  *
  */
 public function processRebuildClassPath()
 {
     CopixAuth::getCurrentUser()->assertCredential('basic:admin');
     CopixAutoloader::getInstance()->rebuildClassPath();
     return _arRedirect(_url('admin||'));
 }
 /**
  * Résouds la référence à une classe ou une instance.
  *
  * @param string $pClassName Classe de l'objet.
  * @param string $pFileName Nom du fichier.
  * @param object $pObject Instance de l'objet.
  * @return array L'information de référence.
  */
 private static function _resolveReference($pClassName, $pFileName = null, $pObject = null)
 {
     if (isset(self::$_globalReferences[$pClassName])) {
         return self::$_globalReferences[$pClassName];
     }
     // Classe "anonyme" ou autoloadée
     if (strtolower($pClassName) == 'stdclass' || CopixAutoloader::canAutoload($pClassName)) {
         return self::$_globalReferences[$pClassName] = false;
     }
     $class = new ReflectionClass($pClassName);
     // DAO ou enregistrement DAO
     if ((class_exists('ICopixDAORecord', false) && $class->implementsInterface('ICopixDAORecord') || class_exists('ICopixDAO', false) && $class->implementsInterface('ICopixDAO')) && ($pFileName !== null || $pObject !== null)) {
         return self::$_globalReferences[$pClassName] = array(self::DAO, $pFileName === null ? $pObject->getDAOId() : $pFileName, null);
     }
     // On a un nom de fichier passé par l'utilisateur
     if ($pFileName !== null) {
         // Le fichier est lisible, on ne cherche pas plus loin
         if (is_readable($pFileName)) {
             return self::$_globalReferences[$pClassName] = array(self::FILE, $pFileName);
         }
         // Si ça ressemble à un sélecteur Copix, on vérifie.
         if (preg_match('/^\\w+\\|\\w+$/', $pFileName)) {
             $selector = CopixSelectorFactory::create($pFileName);
             $filePath = $selector->getPath(COPIX_CLASSES_DIR . strtolower($selector->fileName) . '.class.php');
             if (is_readable($filePath)) {
                 return self::$_globalReferences[$pClassName] = array(self::MODULE_CLASS, $pFileName);
             }
         }
         // Ca n'a pas marché
     }
     // On a rien... essayons de deviner
     $type = self::FILE;
     $fileName = $class->getFileName();
     // Vérifie si ça correpond à une classe de module
     if (preg_match(self::$_moduleClassRegex, $fileName, $parts)) {
         list(, $basePath, $moduleName, $className) = $parts;
         if (CopixModule::isValid($moduleName, $basePath)) {
             // Bingo
             return self::$_globalReferences[$pClassName] = array(self::MODULE_CLASS, $moduleName . '|' . $className);
         }
     }
     // En dernier recours, stocke un fichier
     return self::$_globalReferences[$pClassName] = array($type, $fileName);
 }