abstract constructor