Since removeListener does not delete the map entry, 'l' could be an empty list (which is truthy).  That would seem to violate the spirit/intent.  I suggest just making removeListener delete out the map; that's what the node implementation does and that helps avoid leaks if someone gets dynamic with their event names.