function Column(behavior, columnSchema) {
    switch (typeof columnSchema) {
        case 'number':
            if (!warned.number) {
                console.warn('Column(behavior: object, index: number) overload has been deprecated as of v2.1.6 in favor of Column(behavior: object, columnSchema: object) overload with defined columnSchema.index. (Will be removed in a future release.)');
                warned.number = true;
            }
            columnSchema = {
                index: columnSchema
            };
            break;
        case 'string':
            if (!warned.string) {
                console.warn('Column(behavior:object, name: string) overload (where name is sought in schema) has been deprecated as of v2.1.6 in favor of Column(behavior: object, columnSchema: object) overload with defined columnSchema.index. (Will be removed in a future release.)');
                warned.string = true;
            }
            var name, index;
            name = columnSchema;
            index = behavior.dataModel.schema.findIndex(function(columnSchema) {
                return columnSchema.name === name;
            });
            if (index < 0) {
                throw new this.HypergridError('Column named "' + name + '" not found in schema.');
            }
            columnSchema = {
                name: name,
                index: index
            };
            break;
        case 'object':
            if (columnSchema.index === undefined) {
                if (!warned.object) {
                    console.warn('Column(behavior:object, columnSchema: object) overload (where columnSchema.index is undefined but columnSchema.name is sought in schema) has been deprecated as of v2.1.6 in favor of defined columnSchema.index. (Will be removed in a future release.)');
                    warned.object = true;
                }
                name = columnSchema.name;
                index = behavior.dataModel.schema.findIndex(function(columnSchema) {
                    return columnSchema.name === name;
                });
                if (index < 0) {
                    throw new this.HypergridError('Column named "' + name + '" not found in schema.');
                }
                columnSchema.index = index;
            }
            break;
    }

    if (columnSchema.index === undefined) {
        throw new HypergridError('Column index required.');
    }

    this.behavior = behavior;
    this.dataModel = behavior.dataModel;

    // set `index` and `name` as read-only properties
    Object.defineProperties(this, {
        index: {
            value: columnSchema.index
        },
        name: {
            enumerable: true,
            value: columnSchema.name || columnSchema.index.toString()
        }
    });

    this.properties = this.schema = columnSchema; // see {@link Column#properties properties} setter

    switch (columnSchema.index) {
        case this.behavior.treeColumnIndex:
            // Width of icon + 3-pixel spacer (checked and unchecked should be same width)
            var icon = images[Object.create(this.properties.treeHeader, { isDataRow: { value: true } }).leftIcon];
            this.properties.minimumColumnWidth = icon ? icon.width + 3 : 0;
            break;

        case this.behavior.rowColumnIndex:
            break;

        default:
            if (columnSchema.index < 0) {
                throw new this.HypergridError('New column index ' + columnSchema.index + ' out of range.');
            }
    }
}
@summary Create a new `Column` object.
@mixes cellProperties.columnMixin
@mixes columnProperties.mixin
@constructor
@param {Behavior} behavior
@param {object} columnSchema
@param {number} columnSchema.index
@param {string} columnSchema.name
@param {string} [columnSchema.header] - Displayed in column headers. If not defined, name is used.
@param {function} [columnSchema.calculator] - Define to make a computed column.
@param {string} [columnSchema.type] - For possible data model use. (Not used in core.)

Positive values of `index` are "real" fields.

Negative values of `index` are special cases:
`index` | Meaning
:-----: | --------
   -2   | Row header column
   -1   | Tree (drill-down) column