ready for testing, generic view-model-view-template