//-------------------------------------------------------------------------------------------------------------------------------------------------

            public void Enter(StateMachineFeedbackEventArgs <TState, TTrigger> args)
            {
                if (_onEntered != null)
                {
                    _onEntered(_ownerMachine, args);
                }
            }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private StateMachineFeedbackEventArgs <TState, TTrigger> PerformTrigger(TTrigger trigger, object context)
        {
            var currentState = _currentState;
            var transition   = currentState.ValidateTransition(trigger);

            if (transition == null)
            {
                throw _logger.TransitionNotDefined(_codeBehind.GetType(), currentState.Value, trigger);
            }

            var eventArgs = new StateMachineFeedbackEventArgs <TState, TTrigger>(_currentState.Value, transition.DestinationStateValue, trigger, context);

            _currentState.Leave(eventArgs);

            try
            {
                transition.RaiseTransitioning(eventArgs);
            }
            catch
            {
                _currentState.Enter(eventArgs);
                throw;
            }

            _currentState = _states[transition.DestinationStateValue];
            _currentState.Enter(eventArgs);

            return(eventArgs);
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        /*public TransientStateMachine(IStateMachineCodeBehind<TState, TTrigger> codeBehind, IComponentContext components)
         *  : this(codeBehind, components.ResolveAuto<ILogger>())
         * {
         * }
         *
         * //-----------------------------------------------------------------------------------------------------------------------------------------------------
         *
         * public TransientStateMachine(IStateMachineCodeBehind<TState, TTrigger> codeBehind, Auto<ILogger> logger)
         *  : this(codeBehind, logger.Instance)
         * {
         * }*/

        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public TransientStateMachine(IStateMachineCodeBehind <TState, TTrigger> codeBehind, ILogger logger)
        {
            _logger     = logger;
            _codeBehind = codeBehind;
            _states     = new Dictionary <TState, MachineState>();

            _codeBehind.BuildStateMachine(this);

            if (_currentState == null)
            {
                throw _logger.InitialStateNotSet(_codeBehind.GetType());
            }

            var eventArgs = new StateMachineFeedbackEventArgs <TState, TTrigger>(_currentState.Value);

            _currentState.Enter(eventArgs);

            if (eventArgs.HasFeedback)
            {
                ReceiveTrigger(eventArgs.Feedback);
            }
        }