abstract factory ready. no tests