text: var Backbone = require('backbone');
  var _ = require('underscore');
  var QueryColumnModel = require('./query-column-model');
  
  module.exports = Backbone.Collection.extend({
  
    model: function (attrs, opts) {
      var self = opts.collection;
      return new QueryColumnModel(attrs, {
        configModel: self._configModel,
        tableName: self._tableName
      });
    },
  
    url: function () {
      if (this._tableName) {
        var baseUrl = this._configModel.get('base_url');
        var version = this._configModel.urlVersion('column');
        return baseUrl + '/api/' + version + '/tables/' + this._tableName + '/columns';
      }
  
      return false;
    },
  
    initialize: function (models, opts) {
      if (!opts.configModel) throw new Error('configModel is required');
      if (!opts.querySchemaModel) throw new Error('querySchemaModel is required');
  
      this._tableName = opts.tableName;
      this._querySchemaModel = opts.querySchemaModel;
      this._configModel = opts.configModel;
      this._initBinds();
    },
  
    _initBinds: function () {
      this.bind('add remove change:type change:name', function () {
        this.reset();
        this._querySchemaModel.set('status', 'unfetched');
        this._querySchemaModel.fetch();
      }, this);
      this._querySchemaModel.bind('change:status', function (mdl, status) {
        if (status === 'fetched') {
          this.reset(this._querySchemaModel.columnsCollection.toJSON());
        }
      }, this);
    },
  
    setTableName: function (name) {
      if (!name) return;
  
      if (this._tableName) {
        this._tableName = name;
  
        this.each(function (columnModel) {
          columnModel._tableName = name;
        });
      }
    },
  
    addColumn: function (opts) {
      opts = opts || {};
      this.create(
        {
          name: 'column_' + new Date().getTime(),
          type: 'string',
          isNew: true
        },
        _.extend(
          opts,
          {
            wait: true,
            parse: false
          }
        )
      );
    }
  
  });
  