Dave Thomas here
I don't like code generation. It feels to me as a step backwards and not forwards to a solution.
Instead of saying: "let's write a class/object with this functionality", we say: "let's write another class and a template, to generate a file, which compiled, gives us the needed object and functionality". Hmmm....
If the algorithm is so generic that we can express it in a template/file generator, why can't we write a class which through reflection generates the needed functionality?
How do you unit-test generated files? Do you test the output code, or do you test the new object? If you test the created object (the new functionality), than you have one additional step in unit-testing: compilation.
My point is that:
Ruby is dynamic enough to let be do what I want without leaving the languageSmalltalk is more "extreme" than ruby. There you don't have source files !!!
Java/C# should be "dynamic" too. I think they already are, through reflection and dynamic code generation, almost as flexible/generic as Ruby. But the developers are always scare of the performance loss. So they prefer an "immature" optimization, instead of a "clean" solution.