public Element merge(Element element) throws MergerException {
      if (element == null || this == element || element.isUnknown()) {
         return this;
      }
      if (!this.getClass().getName().equals(element.getClass().getName())) {
         throw new MergerException(this, element);
      }
      Map<String, Element> elementsMap = ((ObjectElement)element).getElements();
      for (String elementKey : elementsMap.keySet()) {
         Element elementValue = elementsMap.get(elementKey);
         if (this.elements.containsKey(elementKey)) {
            Element value =  this.elements.get(elementKey);
            Element mergedValue = value.merge(elementValue);
            if (mergedValue != value) {
               this.elements.put(elementKey, mergedValue);
            }
         } else {
            this.add(elementValue);
         }
      }
      return this;
   }