added event hooks; renamed BasePreprocessController to BaseListener