Add documentation and update implementation to work more like a DSL