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"