add observeValueForKeyPath