optional callback should return results as well