use delegating factory constructor to avoid parameter mismatches