code: public final void append( StringBuilder buffer, Map<String, String> configuration, Tree<Appender> context )
      {
          // Create context if needed
          Tree<Appender> currentContext = context == null ? new Tree<Appender>( this ) : context.addLeaf( this );
  
          // Check recursion
          if ( currentContext.inAncestors( this ) )
          {
              // For the moment just log a warning, and stop the resolving by appending original chunk
              buffer.append( chunk );
  
              logger.warning( format( "Recursion detected within variable resolving:%n%s", currentContext.getRoot() ) );
          }
          // Process real appending
          else
          {
              doAppend( buffer, configuration, currentContext );
              // Dump some info on resolution if this is a root appender
              if ( currentContext.isRoot() && logger.isLoggable( FINEST ) )
              {
                  logger.finest( format( "Resolving variables:%n%s", currentContext ) );
              }
          }
      }
docs: Move provided context to current appender and call {@link #doAppend(StringBuilder, Map, Tree, Parser)} if no recursion has been detected.
  
  @param buffer
  @param configuration
  @param context