...
Furthermore - because the storage model is private we are able to hide implementation detail from the interface. This is contrasted heavily with RMB where the internal storage format is essentially dictated by the public interface definition. In ERM, our interfaces (In and out) always represent one possible serialization of the internal model. This gives us flexibility and the ability to evolve new interfaces independently of our internal storage format. It will also allow us to support GraphQL directly against the module - this will be useful as any given request will only need to locate and serialize the data actually requested - rather than handle objects as immutable blobs - this property is essential when dealing with packages of 1 million titles - even if the list only contained identifiers that link to some other object.
K-Int has used a number of pre-existing tools and libraries to support this work - in particular the KIWT library is used in it's Community distribution to provide instant REST endpoints. Over in Re:Share this library is used to automatically generate JSON SChema for domain objects, and is combined with system level RAML output - so instead of having the RAML external to the app and used to specify it's internal semantics, the app can be asked to describe it's own interface in RAML, and it's own schema objects in JSON Schema - see https://github.com/openlibraryenvironment/mod-rs.