public void handleChangeRecord(DomainObjectChangeRecord rec) {
		//String typeName = DefaultTraceChangeType.getName(rec.getEventType());
		//CountsByType.compute(typeName, (k, v) -> v == null ? 1 : v + 1);
		if (rec.getEventType() == DomainObjectEvent.RESTORED && restoredHandler != null) {
			restoredHandler.accept(rec);
			return;
		}
		if (rec instanceof TraceChangeRecord<?, ?> cr) {
			handleTraceChangeRecord(cr);
			return;
		}
		Consumer<DomainObjectChangeRecord> handler;
		if (null != (handler = untypedMap.get(rec.getEventType()))) {
			handler.accept(rec);
			return;
		}
		unhandled(rec);
	}
Listen for the given event, taking the affected object, the old value, and the new value

@param <T> the type of the affected object
@param <U> the type of the values
@param type the event type
@param handler the handler
Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/TypedEventDispatcher.java