the web2py abstraction layer without web2py