base implementation + tests
document and test