/// <summary>
        /// Adds the final transitions for the given node.  The node's first final transition is
        /// a Finish transition.  The second one is a Quit transition that gets a default guard so
        /// that it will never fire.
        /// </summary>
        /// <param name="node"></param>
        protected void AddFinalTransitions(UmlNode node)
        {
            // Set up the finish transition first so that it is triggered first.
            var finishTransition = node.TransitionTo(FinalNode);

            finishTransition.Fired += HandleTransitionFired;
            // Every node gets an finish transition pointing to Final using the Finish Constraint, Effect and Trigger.
            // Use a copy of the default constraint in case one transition needs to modify it uniquely.
            finishTransition.Guard  = DefaultFinishConstraint.Copy();
            finishTransition.Effect = FinishTransitionEffect;
            // Use a copy of the finish trigger since it will likely be reused many times.
            finishTransition.UseTrigger(FinishTransitionTrigger.Copy());

            // Next, set up the quit transition with a default to never quit.
            if (node is ConditionalNode)
            {
                var conditionalNode = node as ConditionalNode;
                conditionalNode.QuitTransition        = conditionalNode.TransitionTo(FinalNode);
                conditionalNode.QuitTransition.Guard  = new DynamicConstraint <object>("Never True", new object(), (o) => false);
                conditionalNode.QuitTransition.Fired += HandleTransitionFired;
                conditionalNode.QuitTransition.Effect = new DynamicActivity("SetCompletionCauseInterrupted", RunQuitTransitionEffect)
                {
                    LogType = LogType
                };
            }
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                _executionSyncEvent.Dispose();
                foreach (var trigger in RuntimeTriggers)
                {
                    trigger.Dispose();
                }
                RuntimeTriggers.Clear();
                RuntimeTriggers = null;

                if (FinishTransitionTrigger != null)
                {
                    FinishTransitionTrigger.Dispose();
                }
                FinishTransitionEffect = null;
            }
            base.Dispose(disposing);
        }