decouple model from view