public void ProcessEvent <TEvent>(TEvent @event) where TEvent : IEvent { var starter = _definition.GetStarterPredicate <TEvent>()(@event, GetInstanceData()); if (State == InstanceStates.NotStarted && starter) { StartProcess(@event); } switch (State) { case InstanceStates.NotStarted: return; case InstanceStates.Completed: case InstanceStates.Aborted: throw new Exception($"Cannot accept a new event. Instance is {State}"); } var effect = _definition.GetEffectFunc <TEvent>()(@event, GetInstanceData()); _effects.Add(effect); Emit(new EventReceived <TEvent>(@event)); if (_definition.GetCompletionPredicate <TEvent>()(@event, GetInstanceData())) { Emit(new ProcessCompleted <TEvent>(@event)); } }