first argument can also be the callback