class IO::Endpoint::BoundEndpoint

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

def self.bound(endpoint, backlog: Socket::SOMAXCONN, close_on_exec: false)
	sockets = endpoint.bind
	
	sockets.each do |socket|
		socket.close_on_exec = close_on_exec
	end
	
	return self.new(endpoint, sockets, **endpoint.options)
end

def bind(wrapper = Wrapper.default, &block)

def bind(wrapper = Wrapper.default, &block)
	@sockets.map do |server|
		if block_given?
			wrapper.async do
				yield server
			end
		else
			server.dup
		end
	end
end

def close

def close
	@sockets.each(&:close)
	@sockets.clear
end

def initialize(endpoint, sockets, **options)

def initialize(endpoint, sockets, **options)
	super(**options)
	
	@endpoint = endpoint
	@sockets = sockets
end

def inspect

def inspect
	"\#<#{self.class} #{@sockets.size} bound sockets for #{@endpoint}>"
end

def local_address_endpoint(**options)

@returns [CompositeEndpoint] A composite endpoint for the local end of the bound socket.
A endpoint for the local end of the bound socket.
def local_address_endpoint(**options)
	endpoints = @sockets.map do |socket|
		AddressEndpoint.new(socket.to_io.local_address, **options)
	end
	
	return CompositeEndpoint.new(endpoints)
end

def remote_address_endpoint(**options)

@returns [CompositeEndpoint] A composite endpoint for the remote end of the bound socket.
A endpoint for the remote end of the bound socket.
def remote_address_endpoint(**options)
	endpoints = @sockets.map do |wrapper|
		AddressEndpoint.new(socket.to_io.remote_address, **options)
	end
	
	return CompositeEndpoint.new(endpoints)
end

def to_s

def to_s
	"bound:#{@endpoint}"
end