	public List<Supplier<T>> scan(ClassLoader classLoader, String dataFolder) {
		final ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader);
		final List<String> locationPatterns = ImmutableList.of("classpath*:org/**/*." + suppliedClassSimpleName + ".xmi",
				"classpath*:com/**/*." + suppliedClassSimpleName + ".xmi",
				"classpath*:id/**/*." + suppliedClassSimpleName +".xmi",
				"file:" + dataFolder + "/common/*." + suppliedClassSimpleName +".xmi");
		log.trace("Scanning {} for {}", classLoader, locationPatterns);
		try {
			final List<Resource> allResources = new ArrayList<>();
			for (String locationPattern : locationPatterns) {
				final Resource[] resources = resolver.getResources(locationPattern);
				allResources.addAll(ImmutableList.copyOf(resources));
			}
			log.info("Scanned {} returned {} resources: {}",
					locationPatterns, allResources.size(), allResources);
			final List<URL> xmiUrls = ImmutableList.copyOf(Lists.transform(
					allResources, new Function<Resource, URL>() {
				@Override @Nullable
				public URL apply(@Nullable Resource input) {
					try {
						return input.getURL();
					} catch (IOException e) {
						throw new CommonsException("Cannot get URL for " + input, e);
					}
				}
			}));
			final Map<String, List<Supplier<T>>> managedSuppliers = new HashMap<>();
			for (URL xmiUrl : xmiUrls) {
				final List<Supplier<T>> objs = Preconditions.checkNotNull(extractSuppliers(ImmutableList.of(xmiUrl)),
						"extractSuppliers from %s returned null", xmiUrl);
				managedSuppliers.put(xmiUrl.toString(), objs);
			}
			final List<Supplier<T>> scannedSuppliers = ImmutableList.copyOf(Iterables.concat(managedSuppliers.values()));
			return scannedSuppliers;
		} catch (IOException e) {
			throw new CommonsException(e, "Cannot scan %s for %s",
					classLoader, locationPatterns);
		}
	}

	public List<Supplier<T>> scan(ClassLoader classLoader, String dataFolder) {
		final ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader);
		final List<String> locationPatterns = ImmutableList.of("classpath*:org/**/*." + suppliedClassSimpleName + ".xmi",
				"classpath*:com/**/*." + suppliedClassSimpleName + ".xmi",
				"classpath*:id/**/*." + suppliedClassSimpleName +".xmi",
				"file:" + dataFolder + "/common/*." + suppliedClassSimpleName +".xmi");
		log.trace("Scanning {} for {}", classLoader, locationPatterns);
		try {
			final List<Resource> allResources = new ArrayList<>();
			for (String locationPattern : locationPatterns) {
				final Resource[] resources = resolver.getResources(locationPattern);
				allResources.addAll(ImmutableList.copyOf(resources));
			}
			log.info("Scanned {} returned {} resources: {}",
					locationPatterns, allResources.size(), allResources);
			final List<URL> xmiUrls = ImmutableList.copyOf(Lists.transform(
					allResources, new Function<Resource, URL>() {
				@Override @Nullable
				public URL apply(@Nullable Resource input) {
					try {
						return input.getURL();
					} catch (IOException e) {
						throw new CommonsException("Cannot get URL for " + input, e);
					}
				}
			}));
			final Map<String, List<Supplier<T>>> managedSuppliers = new HashMap<>();
			for (URL xmiUrl : xmiUrls) {
				final List<Supplier<T>> objs = Preconditions.checkNotNull(extractSuppliers(ImmutableList.of(xmiUrl)),
						"extractSuppliers from '%s' returned null", xmiUrl);
				managedSuppliers.put(xmiUrl.toString(), objs);
			}
			final List<Supplier<T>> scannedSuppliers = ImmutableList.copyOf(Iterables.concat(managedSuppliers.values()));
			return scannedSuppliers;
		} catch (IOException e) {
			throw new CommonsException(e, "Cannot scan %s for %s",
					classLoader, locationPatterns);
		}
	}
