again reworking the API a little, adding proper listeners