complete factory method pattern