public DataType getDefinitionDataType() {
			StructureDataType struct =
				new StructureDataType(new CategoryPath(PATH), "Type_" + dataOffset, 0);

			for (CliRepresentable mod : modifiers) {
				if (mod instanceof CliCustomMod) {
					CliCustomMod customMod = (CliCustomMod) mod;
					struct.add(customMod.getDefinitionDataType(), "CustomMod", null);
				}
				else if (mod instanceof CliConstraint) {
					struct.add(CliTypeCodeDataType.dataType,
						CliElementType.ELEMENT_TYPE_PINNED.toString(), "Constrained");
				}
				else if (mod instanceof CliByRef) {
					struct.add(CliTypeCodeDataType.dataType,
						CliElementType.ELEMENT_TYPE_BYREF.toString(), "By Reference");
				}
			}

			struct.add(type.getDefinitionDataType(), type.baseTypeCode.toString(), null);
			return struct;
		}
This is the method that subclasses should override. If stream is null, the method must not cause a NullPointerException,
i.e. it must handle this as if there was no stream to begin with.
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/blobs/CliAbstractSig.java