functor (P : Cf_socket.P->
  sig
    module P :
      sig
        module AF :
          sig
            type tag_t = P.AF.tag_t
            type address_t = P.AF.address_t
            val domain : tag_t Cf_socket.domain_t
            val to_sockaddr : address_t -> tag_t Cf_socket.sockaddr_t
            val of_sockaddr : tag_t Cf_socket.sockaddr_t -> address_t
            val unspecified : tag_t Cf_socket.sockaddr_t
          end
        module ST :
          sig
            type tag_t = P.ST.tag_t
            val socktype : tag_t Cf_socket.socktype_t
          end
        val protocol : Cf_socket.protocol_t
      end
    type t = (P.AF.tag_t, P.ST.tag_t) Cf_socket.t
    type address_t = P.AF.address_t
    val create : unit -> t
    val createpair : unit -> t * t
    class basic :
      ?sock:t ->
      unit ->
      object
        val socket_ : t
        method private bind : address_t -> unit
        method close : unit
        method dup : t
        method dup2 : t -> unit
        method fd : Unix.file_descr
        method private getpeername : address_t
        method private getsockname : address_t
        method getsockopt :
          ('a, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> 'a
        method setsockopt :
          ('b, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> '-> unit
        method private shutdown : Unix.shutdown_command -> unit
        method socket : t
      end
  end