decouple data source from rendering