#if swift(>=4.0)
@objcMembers public class {{{requestsImplClassName}}}: {{{classname}}}Requests {
{{#operations}}
{{#operation}}
{{^isEvent}}
{{^first}}

{{/first}}
    public override func register{{{camelizedNickName}}}RequestHandler(handler: @escaping ElectrodeBridgeRequestCompletionHandler) -> UUID? {
        let requestHandlerProcessor = ElectrodeRequestHandlerProcessor(requestName: {{{classname}}}.kRequest{{{camelizedNickName}}},
                                                                       reqClass: {{#requestParam}}{{^isList}}{{{dataType}}}{{/isList}}{{#isList}}[Any]{{/isList}}{{/requestParam}}.self,{{#requestParam}}{{#isList}} reqItemType: {{{baseType}}}.self,{{/isList}}{{/requestParam}}
                                                                       respClass: {{#responseParam}}{{{dataType}}}{{/responseParam}}.self,
                                                                       requestCompletionHandler: handler)
        return requestHandlerProcessor.execute()
    }
{{/isEvent}}
{{/operation}}
{{/operations}}

{{#operations}}
{{#operation}}
{{^isEvent}}
{{^first}}

{{/first}}
    public override func unregister{{{camelizedNickName}}}RequestHandler(uuid: UUID) -> ElectrodeBridgeRequestCompletionHandler? {
        return ElectrodeBridgeHolder.unregisterRequestHandler(with: uuid)
    }
{{/isEvent}}
{{/operation}}
{{/operations}}

{{#operations}}
{{#operation}}
{{^isEvent}}
{{^first}}

{{/first}}
    public override func {{nickname}}({{#hasRequestParam}}{{#requestParam}}{{{paramName}}}: {{dataType}},{{/requestParam}}{{/hasRequestParam}} responseCompletionHandler: @escaping ({{#responseParam}}{{{dataType}}}{{/responseParam}}?, ElectrodeFailureMessage?) -> Void) {
        let requestProcessor = ElectrodeRequestProcessor<{{#requestParam}}{{{dataType}}}{{/requestParam}}, {{#responseParam}}{{{dataType}}}{{/responseParam}}, Any>(
            requestName: {{{classname}}}.kRequest{{{camelizedNickName}}},
            requestPayload: {{#hasRequestParam}}{{#requestParam}}{{{paramName}}},{{/requestParam}}{{/hasRequestParam}}{{^hasRequestParam}}nil,{{/hasRequestParam}}
            respClass: {{#responseParam}}{{{dataType}}}{{/responseParam}}.self,
            responseItemType: {{#responseParam}}{{#isList}}{{{baseType}}}.self{{/isList}}{{^isList}}nil{{/isList}}{{/responseParam}},
            responseCompletionHandler: { data, errorMessage in responseCompletionHandler(data as? {{#responseParam}}{{{dataType}}}{{/responseParam}}, errorMessage) }
        )

        requestProcessor.execute()
    }
{{/isEvent}}
{{/operation}}
{{/operations}}
}

#else

public class {{{requestsImplClassName}}}: {{{classname}}}Requests {
{{#operations}}
{{#operation}}
{{^isEvent}}
{{^first}}

{{/first}}
    public override func register{{{camelizedNickName}}}RequestHandler(handler: @escaping ElectrodeBridgeRequestCompletionHandler) -> UUID? {
        let requestHandlerProcessor = ElectrodeRequestHandlerProcessor(requestName: {{{classname}}}.kRequest{{{camelizedNickName}}},
                                                                       reqClass: {{#requestParam}}{{^isList}}{{{dataType}}}{{/isList}}{{#isList}}[Any]{{/isList}}{{/requestParam}}.self,{{#requestParam}}{{#isList}} reqItemType: {{{baseType}}}.self,{{/isList}}{{/requestParam}}
                                                                       respClass: {{#responseParam}}{{{dataType}}}{{/responseParam}}.self,
                                                                       requestCompletionHandler: handler)
        return requestHandlerProcessor.execute()
    }
{{/isEvent}}
{{/operation}}
{{/operations}}

{{#operations}}
{{#operation}}
{{^isEvent}}
{{^first}}

{{/first}}
    public override func unregister{{{camelizedNickName}}}RequestHandler(uuid: UUID) -> ElectrodeBridgeRequestCompletionHandler? {
        return ElectrodeBridgeHolder.unregisterRequestHandler(with: uuid)
    }
{{/isEvent}}
{{/operation}}
{{/operations}}

{{#operations}}
{{#operation}}
{{^isEvent}}
{{^first}}

{{/first}}
    public override func {{nickname}}({{#hasRequestParam}}{{#requestParam}}{{{paramName}}}: {{dataType}},{{/requestParam}}{{/hasRequestParam}} responseCompletionHandler: @escaping ({{#responseParam}}{{{dataType}}}{{/responseParam}}?, ElectrodeFailureMessage?) -> Void) {
        let requestProcessor = ElectrodeRequestProcessor<{{#requestParam}}{{{dataType}}}{{/requestParam}}, {{#responseParam}}{{{dataType}}}{{/responseParam}}, Any>(
            requestName: {{{classname}}}.kRequest{{{camelizedNickName}}},
            requestPayload: {{#hasRequestParam}}{{#requestParam}}{{{paramName}}},{{/requestParam}}{{/hasRequestParam}}{{^hasRequestParam}}nil,{{/hasRequestParam}}
            respClass: {{#responseParam}}{{{dataType}}}{{/responseParam}}.self,
            responseItemType: {{#responseParam}}{{#isList}}{{{baseType}}}.self{{/isList}}{{^isList}}nil{{/isList}}{{/responseParam}},
            responseCompletionHandler: { data, errorMessage in responseCompletionHandler(data as? {{#responseParam}}{{{dataType}}}{{/responseParam}}, errorMessage) }
        )

        requestProcessor.execute()
    }
{{/isEvent}}
{{/operation}}
{{/operations}}
}
#endif
