def self.open_close(endpoint)
on_opening = "on_#{endpoint}_opening""on_#{endpoint}_opening"
on_opened = "on_#{endpoint}_opened""on_#{endpoint}_opened"
on_closing = "on_#{endpoint}_closing""on_#{endpoint}_closing"
on_closed = "on_#{endpoint}_closed""on_#{endpoint}_closed"
on_error = "on_#{endpoint}_error""on_#{endpoint}_error"
Module.new do
define_method("on_#{endpoint}_local_open""on_#{endpoint}_local_open") do |event|
delegate(on_opened, event) if event.context.remote_open?
end
define_method("on_#{endpoint}_remote_open""on_#{endpoint}_remote_open") do |event|
if event.context.local_open?
delegate(on_opened, event)
elsif event.context.local_uninit?
delegate(on_opening, event)
event.context.open if @opts[:auto_open]
end
end
define_method("on_#{endpoint}_local_close""on_#{endpoint}_local_close") do |event|
delegate(on_closed, event) if event.context.remote_closed?
end
define_method("on_#{endpoint}_remote_close""on_#{endpoint}_remote_close") do |event|
if event.context.remote_condition
delegate_error(on_error, event)
elsif event.context.local_closed?
delegate(on_closed, event)
elsif @opts[:peer_close_is_error]
Condition.assign(event.context.__send__(:_remote_condition), "unexpected peer close")
delegate_error(on_error, event)
else
delegate(on_closing, event)
end
event.context.close if @opts[:auto_close]
end
end
end