/**
  * Internal method that resolves the value of a variable.
  *
  * <p>Most users of this class do not need to call this method. This method is called
  * automatically by the substitution process.
  *
  * <p>Writers of subclasses can override this method if they need to alter how each substitution
  * occurs. The method is passed the variable's name and must return the corresponding value. This
  * implementation uses the {@link #getVariableResolver()} with the variable's name as the key.
  *
  * @param variableName the name of the variable, not null
  * @param buf the buffer where the substitution is occurring, not null
  * @param startPos the start position of the variable including the prefix, valid
  * @param endPos the end position of the variable including the suffix, valid
  * @return the variable's value or <b>null</b> if the variable is unknown
  */
 protected String resolveVariable(
     final String variableName, final StrBuilder buf, final int startPos, final int endPos) {
   final StrLookup<?> resolver = getVariableResolver();
   if (resolver == null) {
     return null;
   }
   return resolver.lookup(variableName);
 }