widget/template/view separation