public boolean hasResolvableValue(GThemeValueMap values) {
		if (value != null) {
			return true;
		}

		Set<String> visitedKeys = new HashSet<>();
		visitedKeys.add(id);
		ThemeValue<T> referred = getReferredValue(values, referenceId);

		// loop resolving indirect references
		while (referred != null) {
			if (referred.value != null) {
				return true;
			}
			visitedKeys.add(referred.id);
			if (visitedKeys.contains(referred.referenceId)) {
				Msg.warn(this, "Theme value reference loop detected for key: " + id);
				return false;
			}
			referred = getReferredValue(values, referred.referenceId);
		}
		return false;
	}
Returns true if the ThemeValue can resolve to the concrete T value (color, font, or icon)
from the given set of theme values.
@param values the set of values to use to try and follow reference chains to ultimately
resolve the ThemeValue to a an actual T value
@return true if the ThemeValue can resolve to the concrete T value (color, font, or icon)
from the given set of theme values.
Ghidra/Framework/Gui/src/main/java/generic/theme/ThemeValue.java