private Value buildDerefValue(
      Element fieldEl, String valueExpr, boolean extractContent, String formatter)
      throws IndexerConfException, InterruptedException, RepositoryException {

    final String[] derefParts = parseDerefParts(fieldEl, valueExpr);
    final FieldType fieldType = constructDerefFieldType(fieldEl, valueExpr, derefParts);

    final DerefValue deref = new DerefValue(fieldType, extractContent, formatter);

    //
    // Run over all children except the last
    //
    boolean lastFollowIsRecord = false;
    for (int i = 0; i < derefParts.length - 1; i++) {
      String derefPart = derefParts[i];

      // A deref expression can navigate through 5 kinds of 'links':
      //  - a link stored in a link field (detected based on presence of a colon)
      //  - a nested record
      //  - a link to the master variant (if it's the literal string 'master')
      //  - a link to a less-dimensioned variant
      //  - a link to a more-dimensioned variant

      if (derefPart.contains(":")) { // It's a field name
        lastFollowIsRecord = processFieldDeref(fieldEl, valueExpr, deref, derefPart);
      } else if (derefPart.equals("master")) { // Link to master variant
        if (lastFollowIsRecord) {
          throw new IndexerConfException(
              "In dereferencing, master cannot follow on record-type field."
                  + " Deref expression: '"
                  + valueExpr
                  + "' at "
                  + LocationAttributes.getLocation(fieldEl));
        }
        lastFollowIsRecord = false;

        deref.addMasterFollow();
      } else if (derefPart.trim().startsWith("-")) { // Link to less dimensioned variant
        if (lastFollowIsRecord) {
          throw new IndexerConfException(
              "In dereferencing, variant cannot follow on record-type field."
                  + " Deref expression: '"
                  + valueExpr
                  + "' at "
                  + LocationAttributes.getLocation(fieldEl));
        }
        lastFollowIsRecord = false;

        processLessDimensionedVariantsDeref(fieldEl, valueExpr, deref, derefPart);
      } else if (derefPart.trim().startsWith("+")) { // Link to more dimensioned variant
        if (lastFollowIsRecord) {
          throw new IndexerConfException(
              "In dereferencing, variant cannot follow on record-type field."
                  + " Deref expression: '"
                  + valueExpr
                  + "' at "
                  + LocationAttributes.getLocation(fieldEl));
        }
        lastFollowIsRecord = false;

        processMoreDimensionedVariantsDeref(fieldEl, valueExpr, deref, derefPart);
      }
    }

    deref.init(typeManager);
    return deref;
  }