
from __future__ import absolute_import

import socket
try:
    from importlib import import_module
except ImportError:
    # for Python 2.6 compatibility
    import_module = __import__

identity = lambda x: x

class Factory(object):
    """
    A class for creating custom socket connections.

    To create a simple connection:

        server_address = ('localhost', 80)
        Factory()(server_address)

    To create an SSL connection:

        Factory(wrapper=ssl.wrap_socket)(server_address)

    To create an SSL connection with parameters to wrap_socket:

        wrapper = functools.partial(ssl.wrap_socket, ssl_cert=get_cert())
        Factory(wrapper=wrapper)(server_address)

    Note that Factory doesn't save the state of the socket itself. The
    caller must do that, as necessary. As a result, the Factory may be
    re-used to create new connections with the same settings.

    """

    family = socket.AF_INET

    def __init__(self, bind_address=('', 0), wrapper=identity):
        self.bind_address = bind_address
        self.wrapper = wrapper

    def from_legacy_params(self, localaddress='', localport=0, ssl=False,
            ipv6=False):
        if localaddress or localport:
            self.bind_address = (localaddress, localport)
        if ssl:
            self.wrapper = import_module('ssl').wrap_socket
        if ipv6:
            self.family = socket.AF_INET6

    def connect(self, server_address):
        sock = self.wrapper(socket.socket(self.family, socket.SOCK_STREAM))
        sock.bind(self.bind_address)
        sock.connect(server_address)
        return sock
    __call__ = connect

@@ -679,24 +679,103 @@
 r_address)%0A%0A
+    To create an IPv6 connection:%0A%0A        Factory(ipv6=True)(server_address)%0A%0A
     Note tha
@@ -1066,16 +1066,28 @@
 identity
+, ipv6=False
 ):%0A     
@@ -1152,16 +1152,75 @@
  wrapper
+%0A        if ipv6:%0A            self.family = socket.AF_INET6
 %0A%0A    de

Add ipv6 option to Factory init, no *need* to use legacy function for ipv6 now