For myself what works is the following, to implement a functionality it's `proc` > `macro` > `template` because I rarely reach for templates for implement actual features as I find that `macro` can do the job and since it can introspect code and is more "supported" in the type system it's much much more preferable imo.. But it I want to optimize things it's `template` > `proc {.inline.}` >>> `macro` since it's a guaranteed copy paste and no function call overhead, `macro` is too overkill for this...