add callback option
add tests