Very cool! The restriction with calling zero-args functions is unfortunate, could this be solved by turning it into a class and dynamically checking whether the type is a function and then invoke it if it is? I would also change implicit declarations into an error, I see you have an throw statement for that but commented out.