make the client code more flexible