make run abstract so user is forced to implement it. we noticed some funny behavior with spark actions in class body, so keep the action in run method