I'm building this, starting from the specification, as a learning exercise