From: Joel VanderWerf Date: 2004-12-16T07:43:41+09:00 Subject: Re: Can I make a new function like attr_accessor? (solved) James Edward Gray II wrote: > On Dec 15, 2004, at 4:28 PM, Jack, Paul wrote: > >> The Observable pattern that itsme213 recommended doesn't >> seem to fit my needs since I need multiple listeners per >> emitter but maybe that's just Java think... > > > Observable does support multiple listeners, just FYI. > > James Edward Gray II > If he's talking about standard ruby Observable, then yes it does support multiple listeners. If he's talking about my inaptly named Observable module (shoulda been ObservableAttrs) then the answer is more subtle. You can have multiple listeners, as long as the listeners are distinct object, rather than multiple listener clauses for one object. In fact, multiple listener clauses for an object are perfectly fine too, as long as they are listening for distinct patterns. The following example has two listeners, each with two "when" clauses: require 'observable' class Speaker extend Observable observable :foo def run self.foo = "1" self.foo = "2" self.foo = "3" end end class Listener def initialize(speaker) speaker.when_foo /2/ do |v| puts "saw a 2 in #{v.inspect}" end speaker.when_foo /\d/ do |v| puts "saw a digit in #{v.inspect}" end # This would override the first when_foo clause #speaker.when_foo /2/ do |v| # puts "overridden" #end end end spk = Speaker.new lst = [Listener.new(spk), Listener.new(spk)] spk.run OUTPUT saw a digit in "1" saw a digit in "1" saw a 2 in "2" saw a digit in "2" saw a digit in "2" saw a 2 in "2" saw a digit in "3" saw a digit in "3"