docs: public static String camelToLisp(final String pString) {
          if (pString == null) {
              throw new IllegalArgumentException("string == null");
          }
          if (pString.length() == 0) {
              return pString;
          }
  
          StringBuilder buf = null;
          int lastPos = 0;
          boolean inCharSequence = false;
          boolean inNumberSequence = false;
  
          // NOTE: Start at index 1, as first letter should never be hyphen
          for (int i = 1; i < pString.length(); i++) {
              char current = pString.charAt(i);
              if (Character.isUpperCase(current)) {
                  // Init buffer if necessary
                  if (buf == null) {
                      buf = new StringBuilder(pString.length() + 3);// Allow for some growth
                  }
  
                  if (inNumberSequence) {
                      // Sequence end
                      inNumberSequence = false;
  
                      buf.append(pString.substring(lastPos, i));
                      if (current != '-') {
                          buf.append('-');
                      }
                      lastPos = i;
                      continue;
                  }
  
                  // Treat multiple uppercase chars as single word
                  char previous = pString.charAt(i - 1);
                  if (i == lastPos || Character.isUpperCase(previous)) {
                      inCharSequence = true;
                      continue;
                  }
  
                  // Append word
                  buf.append(pString.substring(lastPos, i).toLowerCase());
                  if (previous != '-') {
                      buf.append('-');
                  }
                  buf.append(Character.toLowerCase(current));
  
                  lastPos = i + 1;
              }
              else if (Character.isDigit(current)) {
                  // Init buffer if necessary
                  if (buf == null) {
                      buf = new StringBuilder(pString.length() + 3);// Allow for some growth
                  }
  
                  if (inCharSequence) {
                      // Sequence end
                      inCharSequence = false;
  
                      buf.append(pString.substring(lastPos, i).toLowerCase());
                      if (current != '-') {
                          buf.append('-');
                      }
                      lastPos = i;
                      continue;
                  }
  
                  // Treat multiple digits as single word
                  char previous = pString.charAt(i - 1);
                  if (i == lastPos || Character.isDigit(previous)) {
                      inNumberSequence = true;
                      continue;
                  }
  
                  // Append word
                  buf.append(pString.substring(lastPos, i).toLowerCase());
                  if (previous != '-') {
                      buf.append('-');
                  }
                  buf.append(Character.toLowerCase(current));
  
                  lastPos = i + 1;
              }
              else if (inNumberSequence) {
                  // Sequence end
                  inNumberSequence = false;
  
                  buf.append(pString.substring(lastPos, i));
                  if (current != '-') {
                      buf.append('-');
                  }
                  lastPos = i;
              }
              else if (inCharSequence) {
                  // Sequence end
                  inCharSequence = false;
  
                  // NOTE: Special treatment! Last upper case, is first char in
                  // next word, not last char in this word
                  buf.append(pString.substring(lastPos, i - 1).toLowerCase());
                  if (current != '-') {
                      buf.append('-');
                  }
                  lastPos = i - 1;
              }
          }
  
          if (buf != null) {
              // Append the rest
              buf.append(pString.substring(lastPos).toLowerCase());
              return buf.toString();
          }
          else {
              return Character.isUpperCase(pString.charAt(0)) ? pString.toLowerCase() : pString;
          }
      }