metaprogramming and MPL