Added testing, implemented more robust add/remove functionality and supported different ways of adding observers to objects