My personal take on this is that don't go for a solution that is against a language's particular design or pattern. In a language like Elixir, it was designed from the beginning to easily support metaprogramming by making some features available to the developer.