/**
  * 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.
  */
 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);
 }