overloaded factory method