@Override
	public void engage() {
		if (isEngaged()) {
			throw new IllegalStateException("already engaged");
		}
		
		if (this.startStateId == null) {
			throw new RuntimeException("no start state specified");
		}
		
		// register for all events that might can trigger transitions
		for (Transition trans : this.transitions) {
			if (!this.evtSrv.hasListener(this, trans.eventId)) {
				this.evtSrv.addListener(this, trans.eventId);
			}
		}		
		this.engaged = true;
		switchState(this.startStateId);
	}