docs: @Override
  	public void doAppend( StringBuilder buffer, Map<String, String> configuration, Tree<Appender> context )
  	{
  
  		// Resolve key eventually
  		StringBuilder keyBuffer = new StringBuilder();
  		key.append(keyBuffer, configuration, context);
  		String resolvedKey = keyBuffer.toString();
  
  		String resolvedValue = configuration.get(resolvedKey);
  		if ( resolvedValue != null )
  		{
  			// Resolved value from the configuration may have variable
  			// unresolved
  			Resolver value = parser.parse(resolvedValue);
  			if ( !value.needsResolving() )
  			{
  				buffer.append(resolvedValue);
  
  			}
  			// Process value
  			else
  			{
  				if ( !(value instanceof Appender) )
  				{
  					resolvedValue = value.resolve(configuration);
  				} else
  				{
  					StringBuilder resolvedValueBuffer = new StringBuilder();
  					((Appender) value).append(resolvedValueBuffer, configuration, context);
  					resolvedValue = resolvedValueBuffer.toString();
  				}
  
  				buffer.append(resolvedValue);
  				// Update the configuration (not necessary, but can speed up a little when complex dependency between variables)
  				configuration.put(resolvedKey, resolvedValue);
  			}
  		}
  		// No value found from configuration, take default one
  		else if ( defaultValue != null )
  		{
  			defaultValue.append(buffer, configuration, context);
  		}
  		// Fallback, print original chunk, will let the possibility to resolve
  		// it later
  		else
  		{
  			buffer.append(chunk);
  		}
  	}