@Override
	public void addTransition(CogaenId fromStateId, CogaenId toStateId, CogaenId eventId) {
		// validate parameters
		if (!hasState(fromStateId)) {
			throw new RuntimeException("unknown source state " + fromStateId);
		}
		
		if (!hasState(toStateId)) {
			throw new RuntimeException("unknown target state " + toStateId);
		}
		
		if (eventId == null) {
			throw new NullPointerException("event identifier must not be null");
		}
		
		// ensure this transition is unambiguous
		if (hasTransition(fromStateId, eventId)) {
			throw new RuntimeException("ambiguous transition");
		}
		
		// store transition
		this.transitions.add(new Transition(fromStateId, toStateId, eventId));
		
		// if already engaged, start listening on specified events immediately
		if (isEngaged()) {
			if (!this.evtSrv.hasListener(this, eventId)) {
				this.evtSrv.addListener(this, eventId);
			}
		}
	}