21 public function accept()
23 if (substr($this->current() , -1 * strlen($this->_ext)) === $this->_ext) {
24 return is_readable($this->current());
35 public function setExtension($pExt)
55 public function find($pFileName);
73 public function find($pFileName)
76 $tokens = token_get_all(file_get_contents($pFileName,
false));
77 $currentNamespace =
'';
78 $namespaceHunt =
false;
79 $validatedNamespaceHunt =
false;
82 foreach ($tokens as $token) {
83 if (is_array($token)) {
84 if ($token[0] === T_INTERFACE || $token[0] === T_CLASS) {
87 } elseif ($token[0] === T_NAMESPACE) {
88 $namespaceHunt =
true;
91 if ($classHunt && $token[0] === T_STRING) {
92 $toReturn[(strlen($currentNamespace) > 0 ? $currentNamespace .
'\\' :
'') . $token[1]] = $pFileName;
94 } elseif ($namespaceHunt && $validatedNamespaceHunt && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) {
95 $currentNamespace.= $token[1];
96 } elseif ($namespaceHunt && !$validatedNamespaceHunt && $token[0] === T_WHITESPACE) {
97 $currentNamespace =
'';
98 $validatedNamespaceHunt =
true;
99 } elseif ($namespaceHunt && !$validatedNamespaceHunt && $token[0] !== T_WHITESPACE) {
100 $namespaceHunt =
false;
103 if ($token ===
';' || $token ===
'{') {
105 if ($namespaceHunt && !$validatedNamespaceHunt && $token ===
'{') {
106 $currentNamespace =
'';
109 $namespaceHunt =
false;
110 $validatedNamespaceHunt =
false;
123 private $_classHunterStrategy;
131 private function __construct()
138 private static $_instance =
false;
147 public static function instance($pTmpPath, $pTmpFileName =
'directoriesautoloader.cache.php')
149 if (self::$_instance ===
false) {
151 self::$_instance->setCachePath($pTmpPath);
152 self::$_instance->setCacheFileName($pTmpFileName);
153 self::$_instance->_classHunterStrategy = ClassHunterFactory::create(PHP_VERSION);
155 return self::$_instance;
164 public function register()
166 return spl_autoload_register(array(
176 public function forceRegenerate()
178 $this->_canRegenerate =
true;
179 $this->_classes = null;
180 $this->_saveIncache();
181 return self::$_instance;
185 private $_cacheFileName =
'directoriesautoloader.cache.php';
195 public function setCachePath($pTmp)
197 if (!is_writable($pTmp)) {
200 $this->_cachePath = $pTmp;
209 public function setCacheFileName($ptmpFileName)
211 $this->_cacheFileName = $ptmpFileName;
218 public function getCacheFilePath()
220 return $this->_cachePath .
'/' . $this->_cacheFileName;
224 private $_customFilterClasses = null;
234 public function addCustomFilter($pCustomFilterClass)
236 $filterClassParents = class_parents($pCustomFilterClass);
237 if (isset($filterClassParents[
'FilterIterator'])) {
238 if (!is_array($this->_customFilterClasses)) {
239 $this->_customFilterClasses = array(
245 $this->_customFilterClasses[] = $pCustomFilterClass;
250 return self::$_instance;
262 public function autoload($pClassName)
265 if ($this->_loadClass($pClassName)) {
269 if ($this->_canRegenerate) {
270 $this->_canRegenerate =
false;
271 $this->_includesAll();
272 $this->_saveInCache();
273 return $this->autoload($pClassName);
278 private $_canRegenerate =
true;
286 private function _includesAll()
290 foreach ($this->_directories as $directory => $recursive) {
295 if (strpos($directory,
'/') !== 0) {
296 $ret = chdir($this->_cachePath . DIRECTORY_SEPARATOR . $directory);
297 if (
$ret ===
false) {
303 $directories = new \AppendIterator();
306 $directories->append(
new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($directory)));
308 $directories->append(
new \DirectoryIterator($directory));
310 if (is_array($this->_customFilterClasses)) {
311 foreach ($this->_customFilterClasses as $customFilterClass) {
314 $directories =
new $customFilterClass($directories);
320 $files =
new ExtensionFilterIteratorDecorator($directories);
321 $files->setExtension(
'.php');
322 foreach ($files as $fileName) {
323 $classes = $this->_classHunterStrategy->find((
string)$fileName);
324 foreach ($classes as
$className => $fileName) {
325 $this->_classes[strtolower(
$className) ] = $fileName;
341 private $_classes = array();
352 private function _saveIncache()
354 foreach ($this->_classes as
$className => & $fileName) {
355 if (substr($fileName, 0, 2) ==
'./') {
356 $fileName = substr($fileName, 2);
360 $toSave =
'<?php' . PHP_EOL;
361 $toSave.=
'// Cache generated at: ' . date(DATE_W3C) . PHP_EOL;
362 $toSave.=
'$classes = ' . var_export($this->_classes,
true);
365 if (file_put_contents($this->getCacheFilePath() , $toSave) ===
false) {
366 throw new DirectoriesAutoloaderException(
'Cannot write cache file ' . $this->getCacheFilePath());
376 private function _loadClass($pClassName)
379 if (count($this->_classes) === 0) {
380 if (is_readable($this->getCacheFilePath())) {
382 require $this->getCacheFilePath();
383 $this->_classes = $classes;
403 public function addDirectory($pDirectory, $pRecursive =
true)
405 if (!is_readable($pDirectory)) {
408 $this->_directories[$pDirectory] = $pRecursive ?
true :
false;
409 return self::$_instance;
411 private $_directories = array();
422 public static function create($version)