avoid adding listener multiple times