factory abstract class impl done