def listen(address, options = {})
address = expand_addr(address)
if String === address
[ :umask, :backlog, :sndbuf, :rcvbuf, :tries ].each do |key|
value = options[key] or next
Integer === value or
raise ArgumentError, "not an integer: #{key}=#{value.inspect}"
end
[ :tcp_nodelay, :tcp_nopush, :ipv6only ].each do |key|
(value = options[key]).nil? and next
TrueClass === value || FalseClass === value or
raise ArgumentError, "not boolean: #{key}=#{value.inspect}"
end
unless (value = options[:delay]).nil?
Numeric === value or
raise ArgumentError, "not numeric: delay=#{value.inspect}"
end
set[:listener_opts][address].merge!(options)
end
set[:listeners] << address
end