From: "Jack, Paul" Date: 2004-12-16T07:28:09+09:00 Subject: Re: Can I make a new function like attr_accessor? (solved) > BTW, if you're just coming from Ruby to Java, I wrote an > article on my blog that you might find really useful: > http://fhwang.net/blog/40.html Thanks. If nothing else, I've changed to underscores for my methods... I've got it all working nicely now. I used Tom's sample code as a starting point. Thanks, Tom! 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... Anyway, here's the code I ended up using, in case anyone else wants to do this sort of thing. (I tried defining attr_emitter as "def self.attr_emitter" in the Emitter module, but that didn't work. It seems like you have to define these types of things in the Module class?) Thanks everyone for your help! -Paul class Module def attr_emitter(*attrs) attrs.each do |attr| class_eval %{ def #{attr} @#{attr} end def #{attr}=(x) old = @#{attr} @#{attr} = x emit(:#{attr}, old) end } end end end module Emitter def add_listener(listener) raise "Invalid listener" unless listener.respond_to? :property_changed @emitter_listeners = [] unless @emitter_listeners @emitter_listeners.push(listener) self end def remove_listener(listener) return self unless @emitter_listeners @emitter_listeners.delete(listener) self end def emit(sym, oldValue) return self unless @emitter_listeners @emitter_listeners.each { |x| x.property_changed(self, sym, oldValue) } self end end