protected void Setup(TState startState)
    {
        if (startState != null)
        {
            CurrentStateProperty = new ExtendedReactiveProperty <TState>(startState);
        }
        else
        {
            CurrentStateProperty = new ExtendedReactiveProperty <TState>();
        }

        disposables.Add(
            //If current state is changed, fire on exit event for last state and onEnter event for current state
            CurrentStateProperty.Subscribe(s => {
            ExecuteState(s);
        })
            );
    }
 set => SetValue(CurrentStateProperty, value);