option: rewrite the API to use composition