abstract out data model