/**
 * {{&summary}}
 * @method
 * @name {{&className}}#{{&methodName}}
{{#parameters}}
{{^isSingleton}} * @param {{{curlify type}}} {{&camelCaseName}} - {{&description}}{{/isSingleton}}
{{/parameters}}
 *
 */
 {{&className}}.prototype.{{&methodName}} = function(parameters){
    if(parameters === undefined) {
        parameters = {};
    }
    var deferred = {{#isNode}}Q{{/isNode}}{{^isNode}}$q{{/isNode}}.defer();

    var domain = this.domain;
    var path = '{{&path}}';

    var body;
    var queryParameters = {};
    var headers = {};
    var form = {};

    {{#isSecure}}
        if (this.token.isQuery) {
            queryParameters[this.token.headerOrQueryName] = this.token.value;
        } else if (this.token.headerOrQueryName) {
            headers[this.token.headerOrQueryName] = this.token.value;
        } else {
            headers['Authorization'] = 'Bearer ' + this.token.value;
        }
    {{/isSecure}}

    {{#parameters}}

        {{#isQueryParameter}}
            {{#isSingleton}}
                queryParameters['{{&name}}'] = '{{&singleton}}';
            {{/isSingleton}}
            {{^isSingleton}}
                {{#isPatternType}}
                    Object.keys(parameters).forEach(function(parameterName) {
                        if(new RegExp('{{&pattern}}').test(parameterName)){
                            queryParameters[parameterName] = parameters[parameterName];
                        }
                    });
                {{/isPatternType}}
                {{^isPatternType}}
                if(parameters['{{&camelCaseName}}'] !== undefined){
                    queryParameters['{{&name}}'] = parameters['{{&camelCaseName}}'];
                }
                {{/isPatternType}}
            {{/isSingleton}}
        {{/isQueryParameter}}

        {{#isPathParameter}}
            path = path.replace('{{{curlify name}}}', parameters['{{&camelCaseName}}']);
        {{/isPathParameter}}

        {{#isHeaderParameter}}
            {{#isSingleton}}
                headers['{{&name}}'] = '{{&singleton}}';
            {{/isSingleton}}
            {{^isSingleton}}
                if(parameters['{{&camelCaseName}}'] !== undefined){
                    headers['{{&name}}'] = parameters['{{&camelCaseName}}'];
                }
            {{/isSingleton}}
        {{/isHeaderParameter}}

        {{#isBodyParameter}}
            if(parameters['{{&camelCaseName}}'] !== undefined){
                body = parameters['{{&camelCaseName}}'];
            }
        {{/isBodyParameter}}

         {{#isFormParameter}}
            {{#isSingleton}}
                form['{{&name}}'] = '{{&singleton}}';
            {{/isSingleton}}
            {{^isSingleton}}
                if(parameters['{{&camelCaseName}}'] !== undefined){
                    form['{{&name}}'] = parameters['{{&camelCaseName}}'];
                }
            {{/isSingleton}}
        {{/isFormParameter}}

        {{#required}}
        if(parameters['{{&camelCaseName}}'] === undefined){
            deferred.reject(new Error('Missing required {{&paramType}} parameter: {{&camelCaseName}}'));
            return deferred.promise;
        }
        {{/required}}

    {{/parameters}}

    if(parameters.$queryParameters) {
        Object.keys(parameters.$queryParameters)
        .forEach(function(parameterName){
            var parameter = parameters.$queryParameters[parameterName];
            queryParameters[parameterName] = parameter;
        });
    }

    {{> request}}

    return deferred.promise;
 };
