private static void parseModuleDependency(
     final XMLStreamReader reader, final ModuleSpec.Builder specBuilder)
     throws XMLStreamException {
   String name = null;
   String slot = null;
   boolean export = false;
   boolean optional = false;
   final Set<Attribute> required = EnumSet.of(Attribute.NAME);
   final int count = reader.getAttributeCount();
   for (int i = 0; i < count; i++) {
     final Attribute attribute = Attribute.of(reader.getAttributeName(i));
     required.remove(attribute);
     switch (attribute) {
       case NAME:
         name = reader.getAttributeValue(i);
         break;
       case SLOT:
         slot = reader.getAttributeValue(i);
         break;
       case EXPORT:
         export = Boolean.parseBoolean(reader.getAttributeValue(i));
         break;
       case OPTIONAL:
         optional = Boolean.parseBoolean(reader.getAttributeValue(i));
         break;
       default:
         throw unexpectedContent(reader);
     }
   }
   if (!required.isEmpty()) {
     throw missingAttributes(reader.getLocation(), required);
   }
   final MultiplePathFilterBuilder importBuilder = PathFilters.multiplePathFilterBuilder(true);
   final MultiplePathFilterBuilder exportBuilder = PathFilters.multiplePathFilterBuilder(true);
   while (reader.hasNext()) {
     switch (reader.nextTag()) {
       case XMLStreamConstants.END_ELEMENT:
         {
           final PathFilter exportFilter =
               export ? exportBuilder.create() : PathFilters.rejectAll();
           final PathFilter importFilter = importBuilder.create();
           specBuilder.addDependency(
               DependencySpec.createModuleDependencySpec(
                   importFilter,
                   exportFilter,
                   null,
                   ModuleIdentifier.create(name, slot),
                   optional));
           return;
         }
       case XMLStreamConstants.START_ELEMENT:
         {
           switch (Element.of(reader.getName())) {
             case EXPORTS:
               parseFilterList(reader, exportBuilder);
               break;
             case IMPORTS:
               parseFilterList(reader, importBuilder);
               break;
             default:
               throw unexpectedContent(reader);
           }
           break;
         }
       default:
         {
           throw unexpectedContent(reader);
         }
     }
   }
 }