big refactor
all constructor