refactor runner into singleton