refactoring: require subtypes of BaseController