170 lines
3.7 KiB
PHP
170 lines
3.7 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Prophecy.
|
|
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
|
* Marcello Duarte <marcello.duarte@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Prophecy\Doubler\Generator\Node;
|
|
|
|
use Prophecy\Exception\Doubler\MethodNotExtendableException;
|
|
use Prophecy\Exception\InvalidArgumentException;
|
|
|
|
/**
|
|
* Class node.
|
|
*
|
|
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
|
*/
|
|
class ClassNode
|
|
{
|
|
private $parentClass = 'stdClass';
|
|
private $interfaces = array();
|
|
private $properties = array();
|
|
private $unextendableMethods = array();
|
|
|
|
/**
|
|
* @var MethodNode[]
|
|
*/
|
|
private $methods = array();
|
|
|
|
public function getParentClass()
|
|
{
|
|
return $this->parentClass;
|
|
}
|
|
|
|
/**
|
|
* @param string $class
|
|
*/
|
|
public function setParentClass($class)
|
|
{
|
|
$this->parentClass = $class ?: 'stdClass';
|
|
}
|
|
|
|
/**
|
|
* @return string[]
|
|
*/
|
|
public function getInterfaces()
|
|
{
|
|
return $this->interfaces;
|
|
}
|
|
|
|
/**
|
|
* @param string $interface
|
|
*/
|
|
public function addInterface($interface)
|
|
{
|
|
if ($this->hasInterface($interface)) {
|
|
return;
|
|
}
|
|
|
|
array_unshift($this->interfaces, $interface);
|
|
}
|
|
|
|
/**
|
|
* @param string $interface
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasInterface($interface)
|
|
{
|
|
return in_array($interface, $this->interfaces);
|
|
}
|
|
|
|
public function getProperties()
|
|
{
|
|
return $this->properties;
|
|
}
|
|
|
|
public function addProperty($name, $visibility = 'public')
|
|
{
|
|
$visibility = strtolower($visibility);
|
|
|
|
if (!in_array($visibility, array('public', 'private', 'protected'))) {
|
|
throw new InvalidArgumentException(sprintf(
|
|
'`%s` property visibility is not supported.', $visibility
|
|
));
|
|
}
|
|
|
|
$this->properties[$name] = $visibility;
|
|
}
|
|
|
|
/**
|
|
* @return MethodNode[]
|
|
*/
|
|
public function getMethods()
|
|
{
|
|
return $this->methods;
|
|
}
|
|
|
|
public function addMethod(MethodNode $method, $force = false)
|
|
{
|
|
if (!$this->isExtendable($method->getName())){
|
|
$message = sprintf(
|
|
'Method `%s` is not extendable, so can not be added.', $method->getName()
|
|
);
|
|
throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName());
|
|
}
|
|
|
|
if ($force || !isset($this->methods[$method->getName()])) {
|
|
$this->methods[$method->getName()] = $method;
|
|
}
|
|
}
|
|
|
|
public function removeMethod($name)
|
|
{
|
|
unset($this->methods[$name]);
|
|
}
|
|
|
|
/**
|
|
* @param string $name
|
|
*
|
|
* @return MethodNode|null
|
|
*/
|
|
public function getMethod($name)
|
|
{
|
|
return $this->hasMethod($name) ? $this->methods[$name] : null;
|
|
}
|
|
|
|
/**
|
|
* @param string $name
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasMethod($name)
|
|
{
|
|
return isset($this->methods[$name]);
|
|
}
|
|
|
|
/**
|
|
* @return string[]
|
|
*/
|
|
public function getUnextendableMethods()
|
|
{
|
|
return $this->unextendableMethods;
|
|
}
|
|
|
|
/**
|
|
* @param string $unextendableMethod
|
|
*/
|
|
public function addUnextendableMethod($unextendableMethod)
|
|
{
|
|
if (!$this->isExtendable($unextendableMethod)){
|
|
return;
|
|
}
|
|
$this->unextendableMethods[] = $unextendableMethod;
|
|
}
|
|
|
|
/**
|
|
* @param string $method
|
|
* @return bool
|
|
*/
|
|
public function isExtendable($method)
|
|
{
|
|
return !in_array($method, $this->unextendableMethods);
|
|
}
|
|
}
|