Chris@0: . Chris@0: */ Chris@0: Chris@0: namespace Doctrine\Common\Annotations; Chris@0: Chris@0: /** Chris@0: * AnnotationRegistry. Chris@0: */ Chris@0: final class AnnotationRegistry Chris@0: { Chris@0: /** Chris@0: * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. Chris@0: * Chris@0: * Contains the namespace as key and an array of directories as value. If the value is NULL Chris@0: * the include path is used for checking for the corresponding file. Chris@0: * Chris@0: * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@0: static private $autoloadNamespaces = array(); Chris@0: Chris@0: /** Chris@0: * A map of autoloader callables. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@0: static private $loaders = array(); Chris@0: Chris@0: /** Chris@0: * @return void Chris@0: */ Chris@0: static public function reset() Chris@0: { Chris@0: self::$autoloadNamespaces = array(); Chris@0: self::$loaders = array(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Registers file. Chris@0: * Chris@0: * @param string $file Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: static public function registerFile($file) Chris@0: { Chris@0: require_once $file; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Adds a namespace with one or many directories to look for files or null for the include path. Chris@0: * Chris@0: * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. Chris@0: * Chris@0: * @param string $namespace Chris@0: * @param string|array|null $dirs Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: static public function registerAutoloadNamespace($namespace, $dirs = null) Chris@0: { Chris@0: self::$autoloadNamespaces[$namespace] = $dirs; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Registers multiple namespaces. Chris@0: * Chris@0: * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. Chris@0: * Chris@0: * @param array $namespaces Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: static public function registerAutoloadNamespaces(array $namespaces) Chris@0: { Chris@0: self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Registers an autoloading callable for annotations, much like spl_autoload_register(). Chris@0: * Chris@0: * NOTE: These class loaders HAVE to be silent when a class was not found! Chris@0: * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. Chris@0: * Chris@0: * @param callable $callable Chris@0: * Chris@0: * @return void Chris@0: * Chris@0: * @throws \InvalidArgumentException Chris@0: */ Chris@0: static public function registerLoader($callable) Chris@0: { Chris@0: if (!is_callable($callable)) { Chris@0: throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); Chris@0: } Chris@0: self::$loaders[] = $callable; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Autoloads an annotation class silently. Chris@0: * Chris@0: * @param string $class Chris@0: * Chris@0: * @return boolean Chris@0: */ Chris@0: static public function loadAnnotationClass($class) Chris@0: { Chris@0: foreach (self::$autoloadNamespaces AS $namespace => $dirs) { Chris@0: if (strpos($class, $namespace) === 0) { Chris@0: $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; Chris@0: if ($dirs === null) { Chris@0: if ($path = stream_resolve_include_path($file)) { Chris@0: require $path; Chris@0: return true; Chris@0: } Chris@0: } else { Chris@0: foreach((array)$dirs AS $dir) { Chris@0: if (is_file($dir . DIRECTORY_SEPARATOR . $file)) { Chris@0: require $dir . DIRECTORY_SEPARATOR . $file; Chris@0: return true; Chris@0: } Chris@0: } Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: foreach (self::$loaders AS $loader) { Chris@0: if (call_user_func($loader, $class) === true) { Chris@0: return true; Chris@0: } Chris@0: } Chris@0: return false; Chris@0: } Chris@0: }