separated logic from markup/view