static <A> A safeUnstructureAllowingCertainClasses(S s, S... allowedClasses) {
  final Set<S> allowedClassesSet = asSet(map(allowedClasses, func(S name) -> S { "main$" + name }));
  O classFinder = func(S name) {
    if (!allowedClassesSet.contains(name)) fail("Class not allowed to unstructure: " + name);
    ret classForName(name);
  };
  ret (A) unstructure(s, false, classFinder);
}