a little bit more abstraction & clean-up