/// <summary>
        /// Get next valid state based on the current state and event given without changing the current state
        /// If there is no valid next state, TaskStateTransitionException will be thrown.
        /// </summary>
        /// <param name="taskEvent"></param>
        /// <returns></returns>
        internal TaskState GetNext(TaskStateEvent taskEvent)
        {
            StateTransition <TaskState, TaskStateEvent> transition = new StateTransition <TaskState, TaskStateEvent>(_currentState, taskEvent);
            TaskState nextState;

            if (!Transitions.TryGetValue(transition, out nextState))
            {
                throw new TaskStateTransitionException(_currentState, taskEvent);
            }
            return(nextState);
        }
        /// <summary>
        /// Based on the event and current state to determine the next state
        /// </summary>
        /// <param name="systemEvent"></param>
        /// <returns></returns>
        internal SystemState GetNext(SystemStateEvent systemEvent)
        {
            var         transition = new StateTransition <SystemState, SystemStateEvent>(_currentState, systemEvent);
            SystemState nextState;

            if (!Transitions.TryGetValue(transition, out nextState))
            {
                throw new SystemStateTransitionException(_currentState, systemEvent);
            }
            return(nextState);
        }