Jam makes use of: * Java and Kotlin support for runnable scripts. * 'default' methods introduced in Java 8 which allow dynamic proxies to perform deep interception of method calls. Jam uses this to memoize method call results and track dependencies on source files.
Jam is currently self-building and includes the library of build functions it uses to compile its own Java code, download Maven packages, run units tests etc. And because Jam scripts are just code, they can include any build logic and call any libraries you want.