
{{#models}}{{#model}}

export default class {{classname}} {{#parent}}{{^parentModel}}{{#vendorExtensions.x-isArray}}extends Array {{/vendorExtensions.x-isArray}}{{/parentModel}}{{/parent}}{

    constructor({{#vendorExtensions.x-all-required}}{{name}}{{^-last}}, {{/-last}}{{/vendorExtensions.x-all-required}}) {
        {{#parent}}{{^parentModel}}{{#vendorExtensions.x-isArray}}
        super();
        {{/vendorExtensions.x-isArray}}{{/parentModel}}{{/parent}}

        {{#useInheritance}}
        {{#parentModel}}{{classname}}.call(this{{#vendorExtensions.x-all-required}}, {{name}}{{/vendorExtensions.x-all-required}});{{/parentModel}}
        {{#interfaceModels}}{{classname}}.call(this{{#vendorExtensions.x-all-required}}, {{name}}{{/vendorExtensions.x-all-required}});{{/interfaceModels}}
        {{/useInheritance}}

        {{#vars}}{{#required}}this['{{baseName}}'] = {{name}};{{/required}}{{/vars}}

        {{#parent}}{{^parentModel}}return this;{{/parentModel}}{{/parent}}
    }

    static constructFromObject(data, obj) {
        if (data){{! TODO: support polymorphism: discriminator property on data determines class to instantiate.}} {
            obj = obj || new {{classname}}();

            {{#parent}}{{^parentModel}}ApiClient.constructFromObject(data, obj, '{{vendorExtensions.x-itemType}}');{{/parentModel}}
            {{/parent}}

            {{#useInheritance}}{{#parentModel}}{{classname}}.constructFromObject(data, obj);{{/parentModel}}
            {{#interfaces}}{{.}}.constructFromObject(data, obj);{{/interfaces}}
            {{/useInheritance}}

            {{#vars}}
            if (data.hasOwnProperty('{{baseName}}')) {
                obj['{{baseName}}']{{{defaultValueWithParam}}}
            }
            {{/vars}}
        }
        return obj;
    }

{{#vars}}
    {{baseName}} = {{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}undefined{{/defaultValue}};
{{/vars}}

{{#useInheritance}}{{#interfaceModels}}
    // Implement {{classname}} interface:
    {{#allVars}}
    {{baseName}} = {{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}undefined{{/defaultValue}};
    {{/allVars}}
{{/interfaceModels}}{{/useInheritance}}


{{#emitModelMethods}}{{#vars}}
    {{getter}}() {
        return this.{{baseName}};
    }

    {{setter}}({{name}}) {
        this['{{baseName}}'] = {{name}};
    }
{{/vars}}{{/emitModelMethods}}

{{#vars}}
{{#isEnum}}
{{^isContainer}}
{{>partial_model_inner_enum}}
{{/isContainer}}
{{/isEnum}}
{{#items.isEnum}}
{{#items}}
{{^isContainer}}
{{>partial_model_inner_enum}}
{{/isContainer}}
{{/items}}
{{/items.isEnum}}
{{/vars}}

{{/model}}{{/models}}
}

{{>model_interface_namespace}}