refactor to use domain objects for data collection