| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | <?php/* Copyright (c) 2009 hamcrest.org */abstract class FactoryFile{    /**     * Hamcrest standard is two spaces for each level of indentation.     *     * @var string     */    const INDENT = '    ';    private $indent;    private $file;    private $code;    public function __construct($file, $indent)    {        $this->file = $file;        $this->indent = $indent;    }    abstract public function addCall(FactoryCall $call);    abstract public function build();    public function addFileHeader()    {        $this->code = '';        $this->addPart('file_header');    }    public function addPart($name)    {        $this->addCode($this->readPart($name));    }    public function addCode($code)    {        $this->code .= $code;    }    public function readPart($name)    {        return file_get_contents(__DIR__ . "/parts/$name.txt");    }    public function generateFactoryCall(FactoryCall $call)    {        $method = $call->getMethod();        $code = $method->getComment($this->indent) . "\n";        $code .= $this->generateDeclaration($call->getName(), $method);        $code .= $this->generateCall($method);        $code .= $this->generateClosing();        return $code;    }    public function generateDeclaration($name, FactoryMethod $method)    {        $code = $this->indent . $this->getDeclarationModifiers()            . 'function ' . $name . '('            . $this->generateDeclarationArguments($method)            . ')' . "\n" . $this->indent . '{' . "\n";        return $code;    }    public function getDeclarationModifiers()    {        return '';    }    public function generateDeclarationArguments(FactoryMethod $method)    {        if ($method->acceptsVariableArguments()) {            return '/* args... */';        } else {            return $method->getParameterDeclarations();        }    }    public function generateImport(FactoryMethod $method)    {        return $this->indent . self::INDENT . "require_once '" . $method->getClass()->getFile() . "';" . "\n";    }    public function generateCall(FactoryMethod $method)    {        $code = '';        if ($method->acceptsVariableArguments()) {            $code .= $this->indent . self::INDENT . '$args = func_get_args();' . "\n";        }        $code .= $this->indent . self::INDENT . 'return ';        if ($method->acceptsVariableArguments()) {            $code .= 'call_user_func_array(array(\''                . '\\' . $method->getClassName() . '\', \''                . $method->getName() . '\'), $args);' . "\n";        } else {            $code .= '\\' . $method->getClassName() . '::'                . $method->getName() . '('                . $method->getParameterInvocations() . ');' . "\n";        }        return $code;    }    public function generateClosing()    {        return $this->indent . '}' . "\n";    }    public function write()    {        file_put_contents($this->file, $this->code);    }}
 |