@Nullable
	public InheritanceVertex getVertex(@Nonnull String name) {
		InheritanceVertex vertex = vertices.get(name);
		if (vertex == null && !stubs.contains(name)) {
			// Vertex does not exist and was not marked as a stub.
			// We want to look up the vertex for the given class and figure out if its valid or needs to be stubbed.
			InheritanceVertex provided = vertexProvider.apply(name);
			if (provided == STUB || provided == null) {
				// Provider yielded either a stub OR no result. Discard it.
				stubs.add(name);
			} else {
				// Provider yielded a valid vertex. Update the return value and record it in the map.
				vertices.put(name, provided);
				vertex = provided;
			}
		}
		return vertex;
	}
@Test
	void getFamilyOfThrowable() {
		String notFoodExceptionName = Inheritance.NotFoodException.class.getName().replace('.', '/');
		ClassPathNode classPath = workspace.findJvmClass(notFoodExceptionName);
		assertNotNull(classPath, "Could not find class 'NotFoodException'");

		// Assert that looking at child types of throwable finds NotFoodException.
		// Our class extends Exception, which extends Throwable. So there should be a vertex between Throwable and our type.
		JvmClassInfo notFoodException = classPath.getValue().asJvmClass();
		List<ClassInfo> exceptionClasses = graph.getVertex("java/lang/Exception").getAllChildren().stream()
				.map(InheritanceVertex::getValue)
				.toList();
		assertTrue(exceptionClasses.contains(notFoodException), "Subtypes of 'Exception' did not yield 'NotFoodException'");
		List<ClassInfo> throwableClasses = graph.getVertex("java/lang/Throwable").getAllChildren().stream()
				.map(InheritanceVertex::getValue)
				.toList();
		assertTrue(throwableClasses.contains(notFoodException), "Subtypes of 'Throwable' did not yield 'NotFoodException'");
	}