add setListenerIfAbsent and getListener