class Observable def initialize super @observers = [] end def add_observer observer @observers.push observer end def notify *args @observers.each do |obs| obs.update(self, *args) end end def self.attr_notify_accessor *params params.each do |param| name = param.to_s eval(<<-E) def #{name}=(value) @#{name} = value notify :#{name}, @#{name} end def #{name} return @#{name} end E end end end class Person < Observable attr_notify_accessor :name, :age end class PersonView def update(person, prop, value) p "#{person}, #{prop}, #{value}" end end p = Person.new p.add_observer PersonView.new p.name = "Tarou" p.age = 10
実行結果
"#<Person:0x293f718>, name, Tarou" "#<Person:0x293f718>, age, 10"