refactored so that they don't use `self`