can't have too much metaprogramming