class StrategyTracerContext {
    private static final ThreadLocal<StrategyTracerContext> THREAD_LOCAL = new ThreadLocal<StrategyTracerContext>() {
        @Override
        protected StrategyTracerContext initialValue() {
            return new StrategyTracerContext();
        }
    };

    private LinkedList<Object> spanList = new LinkedList<Object>();

    public static StrategyTracerContext getCurrentContext() {
        return THREAD_LOCAL.get();
    }

    public static void clearCurrentContext() {<FILL_FUNCTION_BODY>}

    public Object getSpan() {
        if (spanList.isEmpty()) {
            return null;
        }

        return spanList.getLast();
    }

    public void setSpan(Object span) {
        spanList.addLast(span);
    }

    private LinkedList<Object> getSpanList() {
        return spanList;
    }

    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }

    @Override
    public boolean equals(Object object) {
        return EqualsBuilder.reflectionEquals(this, object);
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    }
}

        StrategyTracerContext strategyTracerContext = THREAD_LOCAL.get();
        if (strategyTracerContext == null) {
            return;
        }

        LinkedList<Object> spanList = strategyTracerContext.getSpanList();
        if (!spanList.isEmpty()) {
            spanList.removeLast();
        }

        if (spanList.isEmpty()) {
            THREAD_LOCAL.remove();
        }
    
<no_super_class>