add a specific factory method rather than using new