sig
  module type S =
    sig
      type caller_query
      type caller_response
      type callee_query
      type callee_response
      val dispatch_multi :
        Versioned_rpc.Both_convert.Connection_with_menu.t ->
        Versioned_rpc.Both_convert.Plain.S.caller_query ->
        Versioned_rpc.Both_convert.Plain.S.caller_response
        Core.Std.Or_error.t Import.Deferred.t
      val implement_multi :
        ?log_not_previously_seen_version:(name:string -> int -> unit) ->
        ('state ->
         Versioned_rpc.Both_convert.Plain.S.callee_query ->
         Versioned_rpc.Both_convert.Plain.S.callee_response Import.Deferred.t) ->
        'state Rpc.Implementation.t list
      val versions : unit -> Core.Std.Int.Set.t
    end
  module Make :
    functor
      (Model : sig
                 val name : string
                 module Caller : sig type query type response end
                 module Callee : sig type query type response end
               end->
      sig
        module Register :
          functor
            (Version : sig
                         val version : int
                         type query
                         type response
                         val query_of_caller_model :
                           Model.Caller.query ->
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                         val callee_model_of_query :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query ->
                           Model.Callee.query
                         val response_of_callee_model :
                           Model.Callee.response ->
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                         val caller_model_of_response :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response ->
                           Model.Caller.response
                         val bin_query :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Type_class.t
                         val bin_read_query :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Read_ml.reader
                         val bin_read_query_ :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Unsafe_read_c.reader
                         val bin_read_query__ :
                           (int ->
                            Versioned_rpc.Both_convert.Plain.Make.Register.query)
                           Core.Std.Bin_prot.Unsafe_read_c.reader
                         val bin_reader_query :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Type_class.reader
                         val bin_size_query :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Size.sizer
                         val bin_write_query :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Write_ml.writer
                         val bin_write_query_ :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Unsafe_write_c.writer
                         val bin_writer_query :
                           Versioned_rpc.Both_convert.Plain.Make.Register.query
                           Core.Std.Bin_prot.Type_class.writer
                         val bin_response :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Type_class.t
                         val bin_read_response :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Read_ml.reader
                         val bin_read_response_ :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Unsafe_read_c.reader
                         val bin_read_response__ :
                           (int ->
                            Versioned_rpc.Both_convert.Plain.Make.Register.response)
                           Core.Std.Bin_prot.Unsafe_read_c.reader
                         val bin_reader_response :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Type_class.reader
                         val bin_size_response :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Size.sizer
                         val bin_write_response :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Write_ml.writer
                         val bin_write_response_ :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Unsafe_write_c.writer
                         val bin_writer_response :
                           Versioned_rpc.Both_convert.Plain.Make.Register.response
                           Core.Std.Bin_prot.Type_class.writer
                       end->
            sig  end
        val dispatch_multi :
          Connection_with_menu.t ->
          Model.Caller.query ->
          Model.Caller.response Core.Std.Or_error.t Import.Deferred.t
        val implement_multi :
          ?log_not_previously_seen_version:(name:string -> int -> unit) ->
          ('state ->
           Model.Callee.query -> Model.Callee.response Import.Deferred.t) ->
          'state Rpc.Implementation.t list
        val versions : unit -> Core.Std.Int.Set.t
      end
end