major refactor into separate constructors