metaprogramming methods