1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
class Form
def initialize
@click = Event.new
end
def click
puts "TRACE: Click"
@click
end
def click=(x)
puts "TRACE: Click=#{x.inspect}"
if x.instance_of? MethodHolder then
@click.add(x.method)
else
@click.set(x)
end
end
end
class MethodHolder
attr :method
def initialize(m)
@method = m
end
end
class Event
def initialize
@methods = []
end
def +(m)
puts "TRACE: +(#{m.inspect}"
MethodHolder.new(m)
end
def call
@methods.each { |m| m.call }
end
def add(m)
@methods << m
end
def <<(m)
@methods << m
end
def set(m)
@methods = [m]
end
def delete(m)
@methods.delete m
end
alias :add,:push
alias :remove,:delete
end
def bar
puts 'hello'
end
def baz
puts 'world'
end
form = Form.new
form.click += method(:bar)
form.click += method(:baz)
form.click.call
|