added meta programming functionality