better abstract based controller