refactoring, now emits newListener & removeListener events