#16 add interface
#16 add implemations
#16 add test helper
#16 test pass