docs: @Override
      public Module parse(final Element element, final Locale locale) {
          if (element.getChild("treatAs", NS) == null) {
              return null;
          }
  
          final SimpleListExtension sle = new SimpleListExtensionImpl();
          sle.setTreatAs(element.getChildText("treatAs", NS));
  
          final Element listInfo = element.getChild("listinfo", NS);
          ArrayList<Object> values = new ArrayList<Object>();
          for (final Element ge : listInfo.getChildren("group", NS)) {
              final Namespace ns = ge.getAttribute("ns") == null ? element.getNamespace() : Namespace.getNamespace(ge.getAttributeValue("ns"));
              final String elementName = ge.getAttributeValue("element");
              final String label = ge.getAttributeValue("label");
              values.add(new Group(ns, elementName, label));
          }
  
          sle.setGroupFields(values.toArray(new Group[values.size()]));
          values = values.size() == 0 ? values : new ArrayList<Object>();
  
          for (final Element se : listInfo.getChildren("sort", NS)) {
              LOG.debug("Parse cf:sort {}{}", se.getAttributeValue("element"), se.getAttributeValue("data-type"));
              final Namespace ns = se.getAttributeValue("ns") == null ? element.getNamespace() : Namespace.getNamespace(se.getAttributeValue("ns"));
              final String elementName = se.getAttributeValue("element");
              final String label = se.getAttributeValue("label");
              final String dataType = se.getAttributeValue("data-type");
              final boolean defaultOrder = se.getAttributeValue("default") == null ? false : new Boolean(se.getAttributeValue("default")).booleanValue();
              values.add(new Sort(ns, elementName, dataType, label, defaultOrder));
          }
  
          sle.setSortFields(values.toArray(new Sort[values.size()]));
          insertValues(sle, element.getChildren());
  
          return sle;
      }