Mapping/Driver/AnnotationDriver.php
private function documentProperties(ClassMetadata $metadata, ReflectionClass $class)
    {
/*

        $interfaces = $class->getInterfaces();
        $linkRelationMethods = array();
        foreach ($interfaces as $interface) {
            if (null !== $this->getAnnotation($interface, $linkRelationAnnot)) {
                if (false === isset($documentation['rels'][$interface->name])) {
                    $documentation['rels'][$interface->name] = array();
                    foreach ($interface->getMethods() as $method) {
                        if ($method->isPublic()) {
                            $documentation['rels'][$interface->name][$method->name] = $interface->name;
                        }
                    }
                }

                $linkRelationMethods += $documentation['rels'][$interface->name];
            }
        }
*/

        $properties = array();
        $elements = array_merge($class->getProperties(), $class->getMethods());

        foreach ($elements as $element) {
            $annotation = $this->getAnnotation($element, 'ML\HydraBundle\Mapping\Expose');

            if (null === $annotation) {
                continue;
            }

            // $exposeAs = $element->name;
            // if ($annotation->as) {
            //     $exposeAs = $annotation->as;

            //     if ($annotation->getIri()) {
            //         $property['iri'] = $annotation->getIri();
            //     } else {
            //         $property['iri'] = $exposeClassAs . '/' . $exposeAs;
            //     }
            // } else {
            //     $exposeAs = $this->propertirize($exposeAs);

            //     if ($annotation->getIri()) {
            //         $property['iri'] = $annotation->getIri();
            //     } else {
            //         $property['iri'] = $this->camelize($exposeAs);
            //         $property['iri'][0] = strtolower($property['iri'][0]);
            //         $property['iri'] =  $exposeClassAs . '/' . $property['iri'];
            //     }
            // }

            $property = new PropertyDefinition($class->name, $element->name);
            $property->setExposeAs($annotation->as);
            $property->setIri($annotation->getIri());

            if (null !== $annotation->required) {
                $property->setRequired($annotation->required);
            }
            if (null !== $annotation->readonly) {
                $property->setReadOnly($annotation->readonly);
            }
            if (null !== $annotation->writeonly) {
                $property->setWriteOnly($annotation->writeonly);
            }

            $tmp = $this->getDocBlockText($element);
            $property->setTitle($tmp['title']);
            $property->setDescription($tmp['description']);

            $tmp = $this->getType($element);
            $property->setType($tmp['type']);

            $this->documentRouteAndOperations($property, $element);

            if (null !== ($annotation = $this->getAnnotation($element, 'ML\HydraBundle\Mapping\Collection'))) {
                // TODO Check for conflicting routes!?
                // TODO Check that the IRI template can be filled!?
                $property->setRoute($this->getRouteMetadata($annotation->route));

                if (false === $property->supportsOperation($annotation->route)) {
                    $property->addOperation($this->getRouteMetadata($annotation->route));
                }

                $property->setType('ML\HydraBundle\Entity\Collection');
                $property->setReadOnly(true);
            }

/*
            if ($element instanceof ReflectionMethod) {
                if (array_key_exists($element->name, $linkRelationMethods)) {
                    $property['original_type'] .= ' --- ' . $linkRelationMethods[$element->name] . '::' . $element->name;
                }
            }
*/
            // TODO Validate definition, this here isn't the right place to do so, create a metadata factory

            $properties[] = $property;
        }

        // $documentation['class2type'][$class->name] = $exposeClassAs;
        // $documentation['types'][$exposeClassAs] = $result;


        $metadata->setProperties($properties);
    }
private function documentProperties(ClassMetadata $metadata, ReflectionClass $class)
    {
/*

        $interfaces = $class->getInterfaces();
        $linkRelationMethods = array();
        foreach ($interfaces as $interface) {
            if (null !== $this->getAnnotation($interface, $linkRelationAnnot)) {
                if (false === isset($documentation['rels'][$interface->name])) {
                    $documentation['rels'][$interface->name] = array();
                    foreach ($interface->getMethods() as $method) {
                        if ($method->isPublic()) {
                            $documentation['rels'][$interface->name][$method->name] = $interface->name;
                        }
                    }
                }

                $linkRelationMethods += $documentation['rels'][$interface->name];
            }
        }
*/

        $properties = array();
        $elements = array_merge($class->getProperties(), $class->getMethods());

        foreach ($elements as $element) {
            $annotation = $this->getAnnotation($element, 'ML\HydraBundle\Mapping\Expose');

            if (null === $annotation) {
                continue;
            }

            // $exposeAs = $element->name;
            // if ($annotation->as) {
            //     $exposeAs = $annotation->as;

            //     if ($annotation->getIri()) {
            //         $property['iri'] = $annotation->getIri();
            //     } else {
            //         $property['iri'] = $exposeClassAs . '/' . $exposeAs;
            //     }
            // } else {
            //     $exposeAs = $this->propertirize($exposeAs);

            //     if ($annotation->getIri()) {
            //         $property['iri'] = $annotation->getIri();
            //     } else {
            //         $property['iri'] = $this->camelize($exposeAs);
            //         $property['iri'][0] = strtolower($property['iri'][0]);
            //         $property['iri'] =  $exposeClassAs . '/' . $property['iri'];
            //     }
            // }

            $property = new PropertyDefinition($class->name, $element->name);
            $property->setExposeAs($annotation->as);
            $property->setIri($annotation->getIri());

            if (null !== $annotation->required) {
                $property->setRequired($annotation->required);
            }
            if (null !== $annotation->readonly) {
                $property->setReadOnly($annotation->readonly);
            }
            if (null !== $annotation->writeonly) {
                $property->setWriteOnly($annotation->writeonly);
            }

            $tmp = $this->getDocBlockText($element);
            $property->setTitle($tmp['title']);
            $property->setDescription($tmp['description']);

            $tmp = $this->getType($element);
            $property->setType($tmp['type']);

            $this->documentRouteAndOperations($property, $element);

            if (null !== ($annotation = $this->getAnnotation($element, 'ML\HydraBundle\Mapping\Collection'))) {
                // TODO Check for conflicting routes!?
                // TODO Check that the IRI template can be filled!?
                $property->setRoute($this->getRouteMetadata($annotation->route));

                if (false === $property->supportsOperation($annotation->route)) {
                    $property->addOperation($this->getRouteMetadata($annotation->route));
                }

                $property->setType('ML\HydraBundle\Entity\Collection');
                $property->setReadOnly(true);
            }

/*
            if ($element instanceof ReflectionMethod) {
                if (array_key_exists($element->name, $linkRelationMethods)) {
                    $property['original_type'] .= ' --- ' . $linkRelationMethods[$element->name] . '::' . $element->name;
                }
            }
*/
            // TODO Validate definition, this here isn't the right place to do so, create a metadata factory

            $properties[] = $property;
        }

        // $documentation['class2type'][$class->name] = $exposeClassAs;
        // $documentation['types'][$exposeClassAs] = $result;


        $metadata->setProperties($properties);
    }
Document the properties and methods associated to a class

@param ClassMetadata $metadata The class definition
@param ReflectionClass $class    The class whose properties and
methods should be documented.