implements own addEventListener