recurse on the callback