def initialize(base, &block)
@base = base
if base.respond_to?(:handle)
unless block.arity == 2
raise ArgumentError, 'passed block must accept 2 arguments'
end
MetaUtils.extend_method(self, :handle, &block)
elsif base.respond_to?(:handle_async)
unless block.arity == 3
raise ArgumentError, 'passed block must accept 3 arguments'
end
MetaUtils.extend_method(self, :handle_async) do |req, resp, handle|
@base.handle_async(req, resp, handle)
end
MetaUtils.extend(self) do
define_method(:handle) do |req, resp|
raise "attempted to call #handle on an async handler"
end
define_method(:handle_async, &block)
end
else
raise ArgumentError, 'base must respond to #handle or #handle_async'
end
end