Вход Регистрация
Файл: gapps/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
Строк: 154
<?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 ProphecyDoublerGeneratorNode;

use 
ProphecyExceptionDoublerMethodNotExtendableException;
use 
ProphecyExceptionInvalidArgumentException;

/**
 * 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)
    {
        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());
        }
        
$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);
    }
}
Онлайн: 0
Реклама