abstract logic so that there can be listeners on any property
add dispose method