protected factory method