use abstractController as base