protected void readChild(XMLStreamReader in) throws XMLStreamException {
        String childName = in.getLocalName();
        if (Ability.getXMLElementTagName().equals(childName)) {
            if (getAttribute(in, "delete", false)) {
                String id = in.getAttributeValue(null, ID_ATTRIBUTE_TAG);
                removeAbilities(id);
                in.nextTag();
            } else {
                Ability ability = new Ability(in, getSpecification());
                if (ability.getSource() == null) {
                    ability.setSource(this);
                }
                addAbility(ability); // Ability close the element
                getSpecification().addAbility(ability);
            }
        } else if (Modifier.getXMLElementTagName().equals(childName)) {
            if (getAttribute(in, "delete", false)) {
                String id = in.getAttributeValue(null, ID_ATTRIBUTE_TAG);
                removeModifiers(id);
                in.nextTag();
            } else {
                Modifier modifier = new Modifier(in, getSpecification());
                if (modifier.getSource() == null) {
                    modifier.setSource(this);
                }
                if (modifier.getIndex() < 0) {
                    modifier.setIndex(getModifierIndex(modifier));
                }
                addModifier(modifier); // Modifier close the element
                getSpecification().addModifier(modifier);
            }
        } else {
            logger.warning("Parsing of " + childName
                + " is not implemented yet");
            while (in.nextTag() != XMLStreamConstants.END_ELEMENT
                   || !in.getLocalName().equals(childName)) {
                in.nextTag();
            }
        }
    }