well most likely we should instead ensure that the same class can be used (or a hierarchy) to represent both concrete and virtual (or composed) modules, but this plays a different role than the other ModuleDefinition class I guess