@Override
  public void readElement(final XMLExtendedStreamReader reader, final FeaturePackDescription result)
      throws XMLStreamException {

    final Set<Attribute> required = EnumSet.noneOf(Attribute.class);
    final int count = reader.getAttributeCount();

    for (int i = 0; i < count; i++) {
      throw ParsingUtils.unexpectedContent(reader);
    }
    if (!required.isEmpty()) {
      throw ParsingUtils.missingAttributes(reader.getLocation(), required);
    }
    while (reader.hasNext()) {
      switch (reader.nextTag()) {
        case XMLStreamConstants.END_ELEMENT:
          {
            return;
          }
        case XMLStreamConstants.START_ELEMENT:
          {
            final Element element = Element.of(reader.getName());

            switch (element) {
              case DEPENDENCIES:
                parseDependencies(reader, result);
                break;
              case ARTIFACT_VERSIONS:
                parseArtifactVersions(reader, result);
                break;
              case CONFIG:
                configModelParser.parseConfig(reader, result.getConfig());
                break;
              case COPY_ARTIFACTS:
                copyArtifactsModelParser.parseCopyArtifacts(reader, result.getCopyArtifacts());
                break;
              case FILE_PERMISSIONS:
                filePermissionsModelParser.parseFilePermissions(
                    reader, result.getFilePermissions());
                break;
              default:
                throw ParsingUtils.unexpectedContent(reader);
            }
            break;
          }
        default:
          {
            throw ParsingUtils.unexpectedContent(reader);
          }
      }
    }
    throw ParsingUtils.endOfDocument(reader.getLocation());
  }