turn this into a generic pub/sub mechanism