eZ component: Reflection, Design
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The Reflection API of PHP
(http://www.php.net/manual/en/language.oop5.reflection.php) itself is
implemented as an extension written in C for maximum performance and conceptual
reasons. The Reflection component is based on this PHP extension and several
elements are derived from the given base classes.

Design description
------------------

The Reflection component is shown in the class diagram. For
all classes of the Reflection API new subclasses are introduced which provide
additional functionality and methods to access annotations and data types.

ezcReflectionClass
	ezcReflectionClass inherits from ReflectionClass and redefines all methods
	which return a PHP reflection object to return objects from the Reflection
	component. In addition to that methods for annotation handling are
	introduced e.g. getTags getAnnotations, isTagged hasAnnotation. The generic
	getDocComment method is superseded by getShortDescription and
	getLongDescription. These methods return only the relevant parts of interest
	from a PHPDoc comment.

	class ezcReflectionClass extends ReflectionClass {
	    public void __construct(string $name)
	    public ezcReflectionMethod getMethod(string $name)
	    public ezcReflectionMethod getConstructor()
	    public ezcReflectionMethod[] getMethods()
	    public ezcReflectionClassType getParentClass()
	    public ezcReflectionProperty getProperty(string $name)
	    public ezcReflectionProperty[] getProperties()
	    public boolean isWebService()
	    public string getShortDescription()
	    public string getLongDescription()
	    public boolean isTagged(string $with)
	    public ezcReflectionDocTag[] getTags(string $name)
	    public ezcReflectionExtension getExtension()
	}

The enhancements to the Reflection API in the classes ezcReflectionFunction,
ezcReflectionMethod, ezcReflectionParameter, ezcReflectionProperty and
ezcReflectionExtension are analogue to those made in ezcReflectionClass and have
a similar behavior.

	class ezcReflectionExtension extends ReflectionExtension {
	    public void __construct(string $name)
	    public ezcReflectionFunction[] getFunctions()
	    public ezcReflectionClass[] getClasses()
	}
	
	class ezcReflectionFunction extends ReflectionFunction {
	    public void __construct(string $name)
	    public ezcReflectionParameter[] getParameters()
	    public ezcReflectionType getReturnType()
	    public string getReturnDescription()
	    public boolean isWebmethod()
	    public string getShortDescription()
	    public string getLongDescription()
	    public boolean isTagged(string $with)
	    public ezcReflectionDocTag[] getTags(string $name)
	}
	
	class ezcReflectionMethod extends ReflectionMethod {
	    public void __construct(mixed class, string name)
	    public ezcReflectionParameter[] getParameters()
	    public ezcReflectionType getReturnType()
	    public string getReturnDescription()
	    public boolean isWebmethod()
	    public string getShortDescription()
	    public string getLongDescription()
	    public boolean isTagged(string $with)
	    public ezcReflectionDocTag[] getTags(string $name)
	    public boolean isMagic()
	    public ezcReflectionClassType getDeclaringClass()
	}
	
	class ezcReflectionParameter extends ReflectionParameter {
	    public void __construct(mixed mixed, mixed parameter)
	    public ezcReflectionType getType()
	    public ezcReflectionClassType getClass()
	    public ezcReflectionFunction getDeclaringFunction()
	    public ezcReflectionClassType getDeclaringClass()
	}
	
	class ezcReflectionProperty extends ReflectionProperty {
	    public void __construct(mixed class, string name)
	    public ezcReflectionType getType()
	    public ezcReflectionClassType getDeclaringClass()
	}


ezcReflection
	A static class called ezcReflection is defined which acts as a central
	entry point and factory for reflection.
	It holds a factory for reflection type objects and a factory for
	documentation parser objects.
	
	getTypeByName will return the appropriate type object for a given data type
	name e.g., specified in an annotation.
	For extensibility it is possible to set a different factory for type objects
	and implement custom type objects with new features.
	
	Currently the ezcReflectionPhpDocParser is used to parse the documentation
	to gather type information. If another documentation style then PHPDoc is used
	a new parser can be set with setDocParser. The parser object has to support
	the clone operation, because each new type object got its own parser object.

ezcReflectionTypeFactory
	A type factory has to implement the interface ezcReflectionTypeFactory and
	can be used to extend the provided type system with additional features.

ezcReflectionTypeFactoryImpl
	If no type factory is provided the default implementation
	ezcReflectionTypeFactoryImpl is chosen which performs proper data type
	mapping for type names provided as strings.

	class ezcReflection {
	    public static ezcReflectionDocParser getDocParserInstance()
	    public static setDocParser(ezcReflectionDocParser $docParser)
	    public void setReflectionTypeFactory(ezcReflectionTypeFactory $factory)
	    public static ezcReflectionType getTypeByName(string $typeName)
   	}

ezcReflectionTypeMapper
	ezcReflectionTypeMapper is a helper class used by the default type factory,
	the primitive type class and some of the annotation classes. It provides
	mappings from various type names which may occur in documentation to
	standardized type names or XML Schema data types.

ezcReflectionType
	The type interface acts as a central interface for the type system. It is
	equipped with several methods to reflect characteristics of a data type. For
	convenience and usability also methods for an XML Schema mapping are
	incorporated at this point.

	interface ezcReflectionType {
	    function ezcReflectionType getArrayType();
	    function ezcReflectionType getMapIndexType();
	    function ezcReflectionType getMapValueType();
	    function boolean isArray();
	    function boolean isClass();
	    function boolean isPrimitive();
	    function boolean isMap();
	    function string toString();
	    function boolean isStandardType();
	    function string getXmlName();
	    function DOMElement getXmlSchema(DOMDocument $dom);
	}

ezcReflectionAbstractType
	The abstract type is one implementation of the type interface and serves as
	an abstract base class for ezcReflectionPrimitiveType and
	ezcReflectionArrayType.

ezcReflectionPrimitiveType
	The primitive type is a specialization of ezcReflectionAbstractType and
	represents the primitive types boolean, integer, float, string and resource.

ezcReflectionArrayType
	The array type is the second class to extend ezcReflectionAbstractType and
	it distinguishes between simple arrays and maps.

ezcReflectionClassType
	This implementation of the type interface represents a class as a type. For
	this purpose it is a specialization of ezcReflectionClass to inherit all its
	capabilities, i.e. unlike ezcReflectionPrimitiveType and
	ezcReflectionArrayType the ezcReflectionClassType is tightly integrated with
	the Reflection API.

	class ezcReflectionClassType extends ezcReflectionClass implements ezcReflectionType {
	    public ezcReflectionType getArrayType()
	    public ezcReflectionType getMapIndexType()
	    public ezcReflectionType getMapValueType()
	    public boolean isArray()
	    public boolean isClass()
	    public boolean isPrimitive()
	    public boolean isMap()
	    public string toString()
	    public boolean isStandardType()
	    public string getXmlName(boolean $usePrefix)
	    public DOMElement getXmlSchema(DOMDocument dom, namespaceXSD)
	    public void __construct(string $name)
	}

ezcReflectionDocParser
	Is an generic documentation parser interface to be able to parse what ever
	documentation style is used. 

ezcReflectionPhpDocParser
	This class parses PHPDoc comments and provides retrieved data in the form
	of annotation objects.

ezcReflectionAnnotationFactory
	This factory creates an ezcReflectionAnnotation object for a given
	annotation.

ezcReflectionAnnotation
	This is a generic class to represent an annotation and it also serves as a
	base class for several specialized annotation classes, e.g.
	ezcReflectionAnnotationParam, ezcReflectionAnnotationReturn and
	ezcReflectionAnnotationVar.

ezcReflectionAnnotationWebService
    This annotation declares a class as to be published as a SOAP or ReST Web Service

ezcReflectionAnnotationWebMethod
    This annotation declares a method as to be published as a WSDL Operation of a SOAP Web Service

ezcReflectionAnnotationRestMethod
    This annotation declares a method as to be published as a ReSTful Web Service;
    The first parameter specifies the HTTP verb and the second one is a regular
    expression for retrieving the method's arguments from a request URI.

ezcReflectionAnnotationRestIn
    This annotation specifies the deserializer class for a ReSTful Web Service.

ezcReflectionAnnotationRestOut
    This annotation specifies serializer class for a ReSTful Web Service.

Guidelines
----------

Algorithms
----------

Data structures
---------------

Diagrams
========

class_diagram.png - Class diagram of the Reflection component and its type system
php-reflection-api.png - Class diagram of the PHP5 Reflection API