add callback
emit value is optional