add abstract listeners (fix #6)