class Async::IO::SharedEndpoint

def self.bound(endpoint, backlog = Socket::SOMAXCONN)

def self.bound(endpoint, backlog = Socket::SOMAXCONN)
	wrappers = []
	
	endpoint.each do |endpoint|
		server = endpoint.bind
		
		server.listen(backlog)
		
		server.close_on_exec = false
		server.reactor = nil
		
		wrappers << server
	end
	
	self.new(endpoint, wrappers)
end

def self.connected(endpoint)

def self.connected(endpoint)
	peer = endpoint.connect
	
	peer.close_on_exec = false
	peer.reactor = nil
	
	self.new(endpoint, [peer])
end

def accept(backlog = nil, &block)

def accept(backlog = nil, &block)
	bind do |server|
		server.accept_each(&block)
	end
end

def bind

def bind
	task = Async::Task.current
	
	@wrappers.each do |server|
		server = server.dup
		
		task.async do |task|
			task.annotate "binding to #{server.inspect}"
			
			begin
				yield server, task
			ensure
				server.close
			end
		end
	end
end

def close

def close
	@wrappers.each(&:close)
end

def connect

def connect
	task = Async::Task.current
	
	@wrappers.each do |peer|
		peer = peer.dup
		
		task.async do |task|
			task.annotate "connected to #{peer.inspect}"
			
			begin
				yield peer, task
			ensure
				peer.close
			end
		end
	end
end

def initialize(endpoint, wrappers)

def initialize(endpoint, wrappers)
	@endpoint = endpoint
	@wrappers = wrappers
end

def to_s

def to_s
	"\#<#{self.class} #{@wrappers.count} descriptors for #{@endpoint}>"
end