nicely refactored data model