Marek Janukowicz wrote:
...
> Is there any way to add an observer if and only if it wasn't already
> registered for a particular Observable object?

<plug>
I don't know about Observable in the standard library, but in my 
observable library on RAA, observers are registered in a hash, so 
registering twice has no effect.

However, it is not quite a plug-in replacement for the standard library, 
though it allows the same functionality. For instance, you declare an 
attr (or method) to be observable, and updates happen when the writer of 
the attr is called, rather when a notify method is called. Also, it 
allows you to register for changes based on pattern matching and case 
matching (===). An example:

   class User
     observable :nickname
   end

   class NicknameChecker
     def initialize(user)
       user.when_nickname /\Afred\z/i do
         puts "I'll call you Fred from now on."
       end
       user.when_nickname /\Agumby\z/i do
         puts "I refuse to address anyone as Gumby."
       end
     end
   end

(There are better examples in the RAA package, which, in retrospect, 
should probably have been named ObservableAttribute or something.)
</plug>