wrapped everything into a nice 'api'