- abstract controller