902: def self.open_datagram_socket address, port, handler=nil, *args
903: klass = if (handler and handler.is_a?(Class))
904: raise ArgumentError, 'must provide module or subclass of EventMachine::Connection' unless Connection > handler
905: handler
906: else
907: Class.new( Connection ) {handler and include handler}
908: end
909:
910: arity = klass.instance_method(:initialize).arity
911: expected = arity >= 0 ? arity : -(arity + 1)
912: if (arity >= 0 and args.size != expected) or (arity < 0 and args.size < expected)
913: raise ArgumentError, "wrong number of arguments for #{klass}#initialize (#{args.size} for #{expected})"
914: end
915:
916: s = open_udp_socket address, port.to_i
917: c = klass.new s, *args
918: @conns[s] = c
919: block_given? and yield c
920: c
921: end