[Modified] factory method