public function add($rel, $href, array $embed = null, array $attributes = null, array $excludeIf = null)
 {
     $relationMetadata = new RelationMetadata($rel);
     if (is_array($href)) {
         if (!isset($href['route'])) {
             throw new \RuntimeException('href\'s "route" is required.');
         }
         $relationMetadata->setRoute($href['route']);
         if (isset($href['parameters'])) {
             $relationMetadata->setParams($href['parameters']);
         }
         if (isset($href['options'])) {
             $relationMetadata->setOptions($href['options']);
         }
     } else {
         $relationMetadata->setUrl($href);
     }
     if (null !== $embed) {
         if (!empty($embed['provider']) && !empty($embed['property'])) {
             throw new \RuntimeException('Content configuration can only have either a provider or a property.');
         }
         if (empty($embed['provider']) && empty($embed['property'])) {
             throw new \RuntimeException('Content configuration needs either a provider or a property.');
         }
         if (isset($embed['provider']) && 2 !== count($embed['provider'])) {
             throw new \RuntimeException('Content "provider" is required, and should be an array of 2 values. [service, method]');
         }
         if (!empty($embed['provider'])) {
             $providerId = $embed['provider'][0];
             $providerMethod = $embed['provider'][1];
         } else {
             $providerId = 'fsc_hateoas.factory.identity';
             $providerMethod = 'get';
         }
         $contentMetadata = new RelationContentMetadata($providerId, $providerMethod);
         if (isset($embed['providerArguments'])) {
             $contentMetadata->setProviderArguments($embed['providerArguments']);
         }
         if (isset($embed['property'])) {
             $contentMetadata->setProviderArguments(array($embed['property']));
         }
         if (isset($embed['serializerType'])) {
             $contentMetadata->setSerializerType($embed['serializerType']);
         }
         if (isset($embed['serializerXmlElementName'])) {
             $contentMetadata->setSerializerXmlElementName($embed['serializerXmlElementName']);
         }
         if (isset($embed['serializerXmlElementRootMetadata'])) {
             $contentMetadata->setSerializerXmlElementRootName($embed['serializerXmlElementRootMetadata']);
         }
         $relationMetadata->setContent($contentMetadata);
     }
     if (null !== $attributes) {
         $relationMetadata->setAttributes($attributes);
     }
     if (null !== $excludeIf) {
         $relationMetadata->setExcludeIf($excludeIf);
     }
     $this->relationsMetadata[] = $relationMetadata;
 }