move to standard abstract factory