122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
<?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);
 | 
						|
    }
 | 
						|
}
 |