Emit events instead of callbacks