abstract controllers