use NewClient to avoid setting hideous getters
introduce the room struct
make the schema specification dynamic