use delegate listener instead of on