Here's the overview of how each of these pieces interact. Remember that
a role is just a digital signature given to a user of some object by
its creator. The client code
creates a new ticket with its Role as a parameter to the constructor. The
client code then asks the database for a Permit and gives it the ticket
it just constructed. The Database checks to see if the ticket is signed
with an appropriate role, if so, the ticket is invalidated and a new
TablePermit is returned to the client code. If not, an exception is thrown.
The TablePermit acts as the forwarder of the Client requests to the private
implementation.