web/enmi/Zend/CodeGenerator/Php/Class.php
changeset 19 1c2f13fd785c
parent 0 4eba9c11703f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/enmi/Zend/CodeGenerator/Php/Class.php	Thu Jan 20 19:30:54 2011 +0100
@@ -0,0 +1,513 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_CodeGenerator
+ * @subpackage PHP
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: Class.php 21915 2010-04-16 20:40:15Z matthew $
+ */
+
+/**
+ * @see Zend_CodeGenerator_Php_Abstract
+ */
+require_once 'Zend/CodeGenerator/Php/Abstract.php';
+
+/**
+ * @see Zend_CodeGenerator_Php_Member_Container
+ */
+require_once 'Zend/CodeGenerator/Php/Member/Container.php';
+
+/**
+ * @see Zend_CodeGenerator_Php_Method
+ */
+require_once 'Zend/CodeGenerator/Php/Method.php';
+
+/**
+ * @see Zend_CodeGenerator_Php_Property
+ */
+require_once 'Zend/CodeGenerator/Php/Property.php';
+
+/**
+ * @see Zend_CodeGenerator_Php_Docblock
+ */
+require_once 'Zend/CodeGenerator/Php/Docblock.php';
+
+/**
+ * @category   Zend
+ * @package    Zend_CodeGenerator
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract
+{
+
+    /**
+     * @var Zend_CodeGenerator_Php_Docblock
+     */
+    protected $_docblock = null;
+
+    /**
+     * @var string
+     */
+    protected $_name = null;
+
+    /**
+     * @var bool
+     */
+    protected $_isAbstract = false;
+
+    /**
+     * @var string
+     */
+    protected $_extendedClass = null;
+
+    /**
+     * @var array Array of string names
+     */
+    protected $_implementedInterfaces = array();
+
+    /**
+     * @var array Array of properties
+     */
+    protected $_properties = null;
+
+    /**
+     * @var array Array of methods
+     */
+    protected $_methods = null;
+
+    /**
+     * fromReflection() - build a Code Generation PHP Object from a Class Reflection
+     *
+     * @param Zend_Reflection_Class $reflectionClass
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public static function fromReflection(Zend_Reflection_Class $reflectionClass)
+    {
+        $class = new self();
+
+        $class->setSourceContent($class->getSourceContent());
+        $class->setSourceDirty(false);
+
+        if ($reflectionClass->getDocComment() != '') {
+            $class->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($reflectionClass->getDocblock()));
+        }
+
+        $class->setAbstract($reflectionClass->isAbstract());
+        $class->setName($reflectionClass->getName());
+
+        if ($parentClass = $reflectionClass->getParentClass()) {
+            $class->setExtendedClass($parentClass->getName());
+            $interfaces = array_diff($reflectionClass->getInterfaces(), $parentClass->getInterfaces());
+        } else {
+            $interfaces = $reflectionClass->getInterfaces();
+        }
+
+        $interfaceNames = array();
+        foreach($interfaces AS $interface) {
+            $interfaceNames[] = $interface->getName();
+        }
+
+        $class->setImplementedInterfaces($interfaceNames);
+
+        $properties = array();
+        foreach ($reflectionClass->getProperties() as $reflectionProperty) {
+            if ($reflectionProperty->getDeclaringClass()->getName() == $class->getName()) {
+                $properties[] = Zend_CodeGenerator_Php_Property::fromReflection($reflectionProperty);
+            }
+        }
+        $class->setProperties($properties);
+
+        $methods = array();
+        foreach ($reflectionClass->getMethods() as $reflectionMethod) {
+            if ($reflectionMethod->getDeclaringClass()->getName() == $class->getName()) {
+                $methods[] = Zend_CodeGenerator_Php_Method::fromReflection($reflectionMethod);
+            }
+        }
+        $class->setMethods($methods);
+
+        return $class;
+    }
+
+    /**
+     * setDocblock() Set the docblock
+     *
+     * @param Zend_CodeGenerator_Php_Docblock|array|string $docblock
+     * @return Zend_CodeGenerator_Php_File
+     */
+    public function setDocblock($docblock)
+    {
+        if (is_string($docblock)) {
+            $docblock = array('shortDescription' => $docblock);
+        }
+
+        if (is_array($docblock)) {
+            $docblock = new Zend_CodeGenerator_Php_Docblock($docblock);
+        } elseif (!$docblock instanceof Zend_CodeGenerator_Php_Docblock) {
+            require_once 'Zend/CodeGenerator/Php/Exception.php';
+            throw new Zend_CodeGenerator_Php_Exception('setDocblock() is expecting either a string, array or an instance of Zend_CodeGenerator_Php_Docblock');
+        }
+
+        $this->_docblock = $docblock;
+        return $this;
+    }
+
+    /**
+     * getDocblock()
+     *
+     * @return Zend_CodeGenerator_Php_Docblock
+     */
+    public function getDocblock()
+    {
+        return $this->_docblock;
+    }
+
+    /**
+     * setName()
+     *
+     * @param string $name
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setName($name)
+    {
+        $this->_name = $name;
+        return $this;
+    }
+
+    /**
+     * getName()
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_name;
+    }
+
+    /**
+     * setAbstract()
+     *
+     * @param bool $isAbstract
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setAbstract($isAbstract)
+    {
+        $this->_isAbstract = ($isAbstract) ? true : false;
+        return $this;
+    }
+
+    /**
+     * isAbstract()
+     *
+     * @return bool
+     */
+    public function isAbstract()
+    {
+        return $this->_isAbstract;
+    }
+
+    /**
+     * setExtendedClass()
+     *
+     * @param string $extendedClass
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setExtendedClass($extendedClass)
+    {
+        $this->_extendedClass = $extendedClass;
+        return $this;
+    }
+
+    /**
+     * getExtendedClass()
+     *
+     * @return string
+     */
+    public function getExtendedClass()
+    {
+        return $this->_extendedClass;
+    }
+
+    /**
+     * setImplementedInterfaces()
+     *
+     * @param array $implementedInterfaces
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setImplementedInterfaces(Array $implementedInterfaces)
+    {
+        $this->_implementedInterfaces = $implementedInterfaces;
+        return $this;
+    }
+
+    /**
+     * getImplementedInterfaces
+     *
+     * @return array
+     */
+    public function getImplementedInterfaces()
+    {
+        return $this->_implementedInterfaces;
+    }
+
+    /**
+     * setProperties()
+     *
+     * @param array $properties
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setProperties(Array $properties)
+    {
+        foreach ($properties as $property) {
+            $this->setProperty($property);
+        }
+
+        return $this;
+    }
+
+    /**
+     * setProperty()
+     *
+     * @param array|Zend_CodeGenerator_Php_Property $property
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setProperty($property)
+    {
+        if (is_array($property)) {
+            $property = new Zend_CodeGenerator_Php_Property($property);
+            $propertyName = $property->getName();
+        } elseif ($property instanceof Zend_CodeGenerator_Php_Property) {
+            $propertyName = $property->getName();
+        } else {
+            require_once 'Zend/CodeGenerator/Php/Exception.php';
+            throw new Zend_CodeGenerator_Php_Exception('setProperty() expects either an array of property options or an instance of Zend_CodeGenerator_Php_Property');
+        }
+
+        if (isset($this->_properties[$propertyName])) {
+            require_once 'Zend/CodeGenerator/Php/Exception.php';
+            throw new Zend_CodeGenerator_Php_Exception('A property by name ' . $propertyName . ' already exists in this class.');
+        }
+
+        $this->_properties[$propertyName] = $property;
+        return $this;
+    }
+
+    /**
+     * getProperties()
+     *
+     * @return array
+     */
+    public function getProperties()
+    {
+        return $this->_properties;
+    }
+
+    /**
+     * getProperty()
+     *
+     * @param string $propertyName
+     * @return Zend_CodeGenerator_Php_Property
+     */
+    public function getProperty($propertyName)
+    {
+        foreach ($this->_properties as $property) {
+            if ($property->getName() == $propertyName) {
+                return $property;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * hasProperty()
+     *
+     * @param string $propertyName
+     * @return bool
+     */
+    public function hasProperty($propertyName)
+    {
+        return isset($this->_properties[$propertyName]);
+    }
+
+    /**
+     * setMethods()
+     *
+     * @param array $methods
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setMethods(Array $methods)
+    {
+        foreach ($methods as $method) {
+            $this->setMethod($method);
+        }
+        return $this;
+    }
+
+    /**
+     * setMethod()
+     *
+     * @param array|Zend_CodeGenerator_Php_Method $method
+     * @return Zend_CodeGenerator_Php_Class
+     */
+    public function setMethod($method)
+    {
+        if (is_array($method)) {
+            $method = new Zend_CodeGenerator_Php_Method($method);
+            $methodName = $method->getName();
+        } elseif ($method instanceof Zend_CodeGenerator_Php_Method) {
+            $methodName = $method->getName();
+        } else {
+            require_once 'Zend/CodeGenerator/Php/Exception.php';
+            throw new Zend_CodeGenerator_Php_Exception('setMethod() expects either an array of method options or an instance of Zend_CodeGenerator_Php_Method');
+        }
+
+        if (isset($this->_methods[$methodName])) {
+            require_once 'Zend/CodeGenerator/Php/Exception.php';
+            throw new Zend_CodeGenerator_Php_Exception('A method by name ' . $methodName . ' already exists in this class.');
+        }
+
+        $this->_methods[$methodName] = $method;
+        return $this;
+    }
+
+    /**
+     * getMethods()
+     *
+     * @return array
+     */
+    public function getMethods()
+    {
+        return $this->_methods;
+    }
+
+    /**
+     * getMethod()
+     *
+     * @param string $methodName
+     * @return Zend_CodeGenerator_Php_Method
+     */
+    public function getMethod($methodName)
+    {
+        foreach ($this->_methods as $method) {
+            if ($method->getName() == $methodName) {
+                return $method;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * hasMethod()
+     *
+     * @param string $methodName
+     * @return bool
+     */
+    public function hasMethod($methodName)
+    {
+        return isset($this->_methods[$methodName]);
+    }
+
+    /**
+     * isSourceDirty()
+     *
+     * @return bool
+     */
+    public function isSourceDirty()
+    {
+        if (($docblock = $this->getDocblock()) && $docblock->isSourceDirty()) {
+            return true;
+        }
+
+        foreach ($this->_properties as $property) {
+            if ($property->isSourceDirty()) {
+                return true;
+            }
+        }
+
+        foreach ($this->_methods as $method) {
+            if ($method->isSourceDirty()) {
+                return true;
+            }
+        }
+
+        return parent::isSourceDirty();
+    }
+
+    /**
+     * generate()
+     *
+     * @return string
+     */
+    public function generate()
+    {
+        if (!$this->isSourceDirty()) {
+            return $this->getSourceContent();
+        }
+
+        $output = '';
+
+        if (null !== ($docblock = $this->getDocblock())) {
+            $docblock->setIndentation('');
+            $output .= $docblock->generate();
+        }
+
+        if ($this->isAbstract()) {
+            $output .= 'abstract ';
+        }
+
+        $output .= 'class ' . $this->getName();
+
+        if ( !empty( $this->_extendedClass) ) {
+            $output .= ' extends ' . $this->_extendedClass;
+        }
+
+        $implemented = $this->getImplementedInterfaces();
+        if (!empty($implemented)) {
+            $output .= ' implements ' . implode(', ', $implemented);
+        }
+
+        $output .= self::LINE_FEED . '{' . self::LINE_FEED . self::LINE_FEED;
+
+        $properties = $this->getProperties();
+        if (!empty($properties)) {
+            foreach ($properties as $property) {
+                $output .= $property->generate() . self::LINE_FEED . self::LINE_FEED;
+            }
+        }
+
+        $methods = $this->getMethods();
+        if (!empty($methods)) {
+            foreach ($methods as $method) {
+                $output .= $method->generate() . self::LINE_FEED;
+            }
+        }
+
+        $output .= self::LINE_FEED . '}' . self::LINE_FEED;
+
+        return $output;
+    }
+
+    /**
+     * _init() - is called at construction time
+     *
+     */
+    protected function _init()
+    {
+        $this->_properties = new Zend_CodeGenerator_Php_Member_Container(Zend_CodeGenerator_Php_Member_Container::TYPE_PROPERTY);
+        $this->_methods = new Zend_CodeGenerator_Php_Member_Container(Zend_CodeGenerator_Php_Member_Container::TYPE_METHOD);
+    }
+
+}