add factorymethod