abstract level creation out to a factory