use meta programming