abstract view controller