In Files

  • test/unit/util/observable.rb


This is a utility class that allows anything mixing it in to notify a set of listeners about interesting events.



We use this for defaults since nil might mean something

Public Instance Methods

add_listener(channel_name, listener_key=NOTHING) click to toggle source

Adds the passed proc as a listener on the channel indicated by channel_name. listener_key is used to remove the listener later; if none is specified, the proc itself is used.

Whatever is used as the listener_key is returned, making it very easy to use the proc itself as the listener_key:

listener = add_listener("Channel") { ... }
remove_listener("Channel", listener)
               # File test/unit/util/observable.rb, line 31
def add_listener(channel_name, listener_key=NOTHING, &listener) # :yields: value
    raise"No callback was passed as a listener")
  key = listener_key
  if (listener_key == NOTHING)
    listener_key = listener
    key =
  channels[channel_name] ||= {}
  channels[channel_name][key] = listener
  return listener_key
notify_listeners(channel_name, *arguments) click to toggle source

Calls all the procs registered on the channel indicated by channel_name. If value is specified, it is passed in to the procs, otherwise they are called with no arguments.

               # File test/unit/util/observable.rb, line 74
def notify_listeners(channel_name, *arguments)
  channel = channels[channel_name]
  return 0 unless (channel)
  listeners = channel.values
  listeners.each { |listener|*arguments) }
  return listeners.size
remove_listener(channel_name, listener_key) click to toggle source

Removes the listener indicated by listener_key from the channel indicated by channel_name. Returns the registered proc, or nil if none was found.

               # File test/unit/util/observable.rb, line 51
def remove_listener(channel_name, listener_key)
  channel = channels[channel_name]
  return nil unless (channel)
  key = listener_key
  if (listener_key.instance_of?(Proc))
    key =
  if (channel.has_key?(key))
    return channel.delete(key)
  return nil

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit