public void readExternal(@NotNull Element element) {
   Map<String, AbstractProperty> propertyByName = new THashMap<>();
   for (AbstractProperty abstractProperty : myExternalizers.keySet()) {
     propertyByName.put(abstractProperty.getName(), abstractProperty);
   }
   for (Element child : element.getChildren()) {
     AbstractProperty property = propertyByName.get(child.getName());
     if (property == null) {
       continue;
     }
     Externalizer externalizer = myExternalizers.get(property);
     if (externalizer == null) {
       continue;
     }
     try {
       myValues.put(property, externalizer.readValue(child));
     } catch (Exception e) {
       LOG.info(e);
     }
   }
 }
  public void writeExternal(@NotNull Element element) {
    if (myExternalizers.isEmpty()) {
      return;
    }

    List<AbstractProperty> properties = new ArrayList<>(myExternalizers.keySet());
    Collections.sort(properties, AbstractProperty.NAME_COMPARATOR);
    for (AbstractProperty property : properties) {
      Externalizer externalizer = myExternalizers.get(property);
      if (externalizer == null) {
        continue;
      }

      Object propValue = property.get(this);
      if (!Comparing.equal(propValue, property.getDefault(this))) {
        Element child = new Element(property.getName());
        externalizer.writeValue(child, propValue);
        if (!JDOMUtil.isEmpty(child)) {
          element.addContent(child);
        }
      }
    }
  }
 public void rememberKey(AbstractProperty property) {
   LOG.assertTrue(myExternalizers.get(property) == null, property.getName());
   myExternalizers.put(property, null);
 }
 public <T> void registerProperty(AbstractProperty<T> property, Externalizer<T> externalizer) {
   String name = property.getName();
   LOG.assertTrue(!myExternalizers.containsKey(property), name);
   myExternalizers.put(property, externalizer);
 }
 /**
  * Register pre-defined Property Accessor
  *
  * @param propertyAccessor AbstractProperty
  */
 private void registerPropertyAccessor(AbstractProperty propertyAccessor) {
   propertyAccessors.put(propertyAccessor.getName(), propertyAccessor);
 }