change observer to delegate