public static Source forResourceRef(ResourceRef resourceRef, Function<String, String> replaceProperties) {
		String ext = resourceRef.getExtension();
		if (ext.equals("kt")) {
			return new KotlinSource(resourceRef, replaceProperties);
		} else if (ext.equals("groovy")) {
			return new GroovySource(resourceRef, replaceProperties);
		} else if (ext.equals("jsh")) {
			return new JshSource(resourceRef, replaceProperties);
		} else if (ext.equals("md")) {
			return MarkdownSource.create(resourceRef, replaceProperties);
		} else {
			return new JavaSource(resourceRef, replaceProperties);
		}
	}
A Script represents a Source (something runnable) in the form of a source
file. It's code that first needs to be compiled before it can be executed.
The Script extracts as much information from the source file as it can, like
all `//`-directives (eg. `//SOURCES`, `//DEPS`, etc.)

NB: The Script contains/returns no other information than that which can be
induced from the source file. So all Scripts that refer to the same source
file will contain/return the exact same information.
src/main/java/dev/jbang/source/Source.java