/// <summary>
        /// A tree has found to be a candidate for substitution. Apply logic.
        /// </summary>
        /// <param name="builder">Tree builder class</param>
        /// <param name="characterName">name of the character evolding</param>
        /// <param name="action">action that triggered evolution</param>
        /// <param name="decisionTreeToChange">Decision Tree To evolve</param>
        /// <returns></returns>
        public bool SubstituteNode(ITreeBuilder builder, string characterName, RNPC.Core.Action.Action action, string decisionTreeToChange)
        {
            var initialAction = ((Reaction)action).InitialEvent as RNPC.Core.Action.Action;

            if (initialAction == null)
            {
                return(false);
            }

            var substitution = _substitutionMapper.GetSubstitutableSubTreeForLeaf(action.EventName);

            if (substitution == null)
            {
                return(false);
            }

            var firstNode = builder.BuildTreeFromDocument(_fileController, initialAction, characterName);

            if (firstNode == null)
            {
                return(false);
            }

            var replacementNode = builder.BuildSubTreeFromRepository(_fileController, substitution.SubTreeName, ConfigurationDirectory.Instance.SubTreeRepository);

            if (replacementNode == null)
            {
                return(false);
            }

            if (!FindAndReplaceMatchingNode(firstNode, substitution, replacementNode))
            {
                return(false);
            }

            string fileName = initialAction.ActionType + "-" + initialAction.Intent + "-" + initialAction.EventName;

            builder.BuildAndSaveXmlDocumentFromTree(_fileController, firstNode, fileName, characterName);

            return(true);
        }