  We extend prior work on class-morphing to provide a more expressive
pattern-based compile-time reflection language. Our MorphJ language offers a
disciplined form of metaprogramming that produces types by statically iterating
over and pattern-matching on fields and methods of other types. We expand such
capabilities with "universal morphing", which also allows pattern-matching over
types (e.g., all classes nested in another, all supertypes of a class) while
maintaining modular type safety for our meta-programs. We present informal
examples of the functionality and discuss a design for adding universal
morphing to Java.
