| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | <?php/* Copyright (c) 2009 hamcrest.org *//** * Controls the process of extracting @factory doctags * and generating factory method files. * * Uses File_Iterator to scan for PHP files. */class FactoryGenerator{    /**     * Path to the Hamcrest PHP files to process.     *     * @var string     */    private $path;    /**     * @var array of FactoryFile     */    private $factoryFiles;    public function __construct($path)    {        $this->path = $path;        $this->factoryFiles = array();    }    public function addFactoryFile(FactoryFile $factoryFile)    {        $this->factoryFiles[] = $factoryFile;    }    public function generate()    {        $classes = $this->getClassesWithFactoryMethods();        foreach ($classes as $class) {            foreach ($class->getMethods() as $method) {                foreach ($method->getCalls() as $call) {                    foreach ($this->factoryFiles as $file) {                        $file->addCall($call);                    }                }            }        }    }    public function write()    {        foreach ($this->factoryFiles as $file) {            $file->build();            $file->write();        }    }    public function getClassesWithFactoryMethods()    {        $classes = array();        $files = $this->getSortedFiles();        foreach ($files as $file) {            $class = $this->getFactoryClass($file);            if ($class !== null) {                $classes[] = $class;            }        }        return $classes;    }    public function getSortedFiles()    {        $iter = $this->getFileIterator();        $files = array();        foreach ($iter as $file) {            $files[] = $file;        }        sort($files, SORT_STRING);        return $files;    }    private function getFileIterator()    {        $factoryClass = class_exists('File_Iterator_Factory') ? 'File_Iterator_Factory' : 'SebastianBergmann\FileIterator\Factory';        $factory = new $factoryClass();        return $factory->getFileIterator($this->path, '.php');    }    public function getFactoryClass($file)    {        $name = $this->getFactoryClassName($file);        if ($name !== null) {            require_once $file;            if (class_exists($name)) {                $class = new FactoryClass(substr($file, strpos($file, 'Hamcrest/')), new ReflectionClass($name));                if ($class->isFactory()) {                    return $class;                }            }        }        return null;    }    public function getFactoryClassName($file)    {        $content = file_get_contents($file);        if (preg_match('/namespace\s+(.+);/', $content, $namespace)            && preg_match('/\n\s*class\s+(\w+)\s+extends\b/', $content, $className)            && preg_match('/@factory\b/', $content)        ) {            return $namespace[1] . '\\' . $className[1];        }        return null;    }}
 |