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);
|
||
|
}
|
||
|
}
|