This allows more options to be added nicely in the future, and hides the implementation details from library users.