TODO: mediator pattern