understanding metaprograms