cleanup API, move some methods into abstract factory