@SuppressWarnings("unchecked")
	protected <T> AbstractDBTracePropertyMap<T, ?> doCreateMap(String name, OpenMode openMode,
			Class<T> valueClass) {
		String tableName = "AddressProperty: " + name;
		try {
			if (valueClass == Integer.class) {
				return (AbstractDBTracePropertyMap<T, ?>) new DBTraceIntPropertyMap(tableName, dbh,
					openMode, lock, TaskMonitor.DUMMY, baseLanguage, trace, threadManager);
			}
			if (valueClass == Long.class) {
				return (AbstractDBTracePropertyMap<T, ?>) new DBTraceLongPropertyMap(tableName, dbh,
					openMode, lock, TaskMonitor.DUMMY, baseLanguage, trace, threadManager);
			}
			if (valueClass == String.class) {
				return (AbstractDBTracePropertyMap<T, ?>) new DBTraceStringPropertyMap(tableName,
					dbh, openMode, lock, TaskMonitor.DUMMY, baseLanguage, trace, threadManager);
			}
			if (valueClass == Void.class) {
				return (AbstractDBTracePropertyMap<T, ?>) new DBTraceVoidPropertyMap(tableName, dbh,
					openMode, lock, TaskMonitor.DUMMY, baseLanguage, trace, threadManager);
			}
			if (Saveable.class.isAssignableFrom(valueClass)) {
				Class<? extends Saveable> saveableClass = valueClass.asSubclass(Saveable.class);
				return (AbstractDBTracePropertyMap<T, ?>) new DBTraceSaveablePropertyMap<>(
					tableName, dbh, openMode, lock, TaskMonitor.DUMMY, baseLanguage, trace,
					threadManager, saveableClass);
			}
		}
		catch (IOException e) {
			dbError(e);
		}
		catch (VersionException e) {
			throw new AssertionError(e);
		}
		throw new IllegalArgumentException("Unsupported value class: " + valueClass);
	}
TODO: Document me

TODO: This is public for user properties, i.e., {@link ProgramUserData}, but encapsulated for
trace properties
Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/property/DBTraceAddressPropertyManager.java