basic metaprogramming done