use Observerpattern