class VirtualFileManager extends ForwardingJavaFileManager<JavaFileManager> {

		private VirtualFileManager(JavaFileManager fallback) {
			super(fallback);
		}

		@Override
		public Iterable<JavaFileObject> list(Location location, String packageName,
											 Set<Kind> kinds, boolean recurse) throws IOException {<FILL_FUNCTION_BODY>}

		@Override
		public String inferBinaryName(Location location, JavaFileObject file) {
			if (file instanceof ResourceVirtualJavaFileObject && file.getKind() == Kind.CLASS) {
				return ((ResourceVirtualJavaFileObject) file).getResourceName().replace('/', '.');
			}
			return super.inferBinaryName(location, file);
		}

		@Override
		public JavaFileObject getJavaFileForOutput(Location location, String name, Kind
				kind, FileObject sibling) throws IOException {
			String internal = name.replace('.', '/');
			VirtualJavaFileObject obj = unitMap.get(internal);
			// Unknown class, assumed to be an inner class.
			// add to the unit map so it can be fetched.
			if (obj == null) {
				obj = new VirtualJavaFileObject(internal, null);
				unitMap.put(internal, obj);
			}
			return obj;
		}
	}

			Iterable<JavaFileObject> list = super.list(location, packageName, kinds, recurse);
			if ("CLASS_PATH".equals(location.getName()) && kinds.contains(Kind.CLASS)) {
				String formatted = packageName.isEmpty() ? "" : packageName.replace('.', '/') + '/';
				Set<JavaFileObject> result = Sets.newHashSet(list);
				Predicate<String> check;
				if (recurse) {
					check = s -> s.startsWith(formatted);
				} else {
					check = s -> s.startsWith(formatted)
							&& s.indexOf('/', formatted.length()) == -1;
				}
				classpath.stream()
						.flatMap(x -> x.getClasses().entrySet().stream())
						.filter(e -> check.test(e.getKey()))
						.forEach(x -> result.add(new ResourceVirtualJavaFileObject(x.getKey(),
								x.getValue(), Kind.CLASS)));
				return result;
			}
			return list;
		
<no_super_class>