added some meta programming stuff