refactor registration controller to allow better subclassing