public ComponentAttributeSourceImpl(
      XMLComponentElement componentElement,
      AttributeSourceContainer parentContainer,
      LocalBindingContext bindingContext) {
    this.componentElement = componentElement;
    this.parentContainer = parentContainer;

    this.componentClassReference =
        bindingContext.makeClassReference(
            bindingContext.qualifyClassName(componentElement.getClazz()));
    this.path = parentContainer.getPath() + '.' + componentElement.getName();
  }
 @Override
 public String getExplicitTuplizerClassName() {
   if (componentElement.getTuplizer() == null) {
     return null;
   }
   final EntityMode entityMode =
       StringHelper.isEmpty(componentElement.getClazz()) ? EntityMode.MAP : EntityMode.POJO;
   for (XMLTuplizerElement tuplizerElement : componentElement.getTuplizer()) {
     if (entityMode == EntityMode.parse(tuplizerElement.getEntityMode())) {
       return tuplizerElement.getClazz();
     }
   }
   return null;
 }
 @Override
 public Iterable<AttributeSource> attributeSources() {
   List<AttributeSource> attributeSources = new ArrayList<AttributeSource>();
   for (Object attributeElement : componentElement.getPropertyOrManyToOneOrOneToOne()) {
     if (XMLPropertyElement.class.isInstance(attributeElement)) {
       attributeSources.add(
           new PropertyAttributeSourceImpl(
               XMLPropertyElement.class.cast(attributeElement), getLocalBindingContext()));
     } else if (XMLComponentElement.class.isInstance(attributeElement)) {
       attributeSources.add(
           new ComponentAttributeSourceImpl(
               (XMLComponentElement) attributeElement, this, getLocalBindingContext()));
     } else if (XMLManyToOneElement.class.isInstance(attributeElement)) {
       attributeSources.add(
           new ManyToOneAttributeSourceImpl(
               XMLManyToOneElement.class.cast(attributeElement), getLocalBindingContext()));
     } else if (XMLOneToOneElement.class.isInstance(attributeElement)) {
       // todo : implement
     } else if (XMLAnyElement.class.isInstance(attributeElement)) {
       // todo : implement
     } else if (XMLOneToManyElement.class.isInstance(attributeElement)) {
       // todo : implement
     } else if (XMLManyToManyElement.class.isInstance(attributeElement)) {
       // todo : implement
     }
   }
   return attributeSources;
 }
 @Override
 public String getParentReferenceAttributeName() {
   return componentElement.getParent() == null ? null : componentElement.getParent().getName();
 }
 @Override
 public String getClassName() {
   return componentElement.getClazz();
 }
 @Override
 public Iterable<MetaAttributeSource> metaAttributes() {
   return Helper.buildMetaAttributeSources(componentElement.getMeta());
 }
 @Override
 public boolean isIncludedInOptimisticLocking() {
   return componentElement.isOptimisticLock();
 }
 @Override
 public boolean isLazy() {
   return componentElement.isLazy();
 }
 @Override
 public boolean isUpdatable() {
   return componentElement.isUpdate();
 }
 @Override
 public boolean isInsertable() {
   return componentElement.isInsert();
 }
 @Override
 public String getPropertyAccessorName() {
   return componentElement.getAccess();
 }