var listFilter = function(__list) {
  __list = __list || [];
  var __criteria = {};
  var __filter = function(item) { return true; };

  var instance = {};

  // list getter/setter
  instance.list = function(value) {
    if(value === undefined) {
      return __list;
    } else {
      __list = value;
      this.trigger("onchange");
    }
  };

  // list appender
  instance.add = function(items) {
    this.list(__list.concat(items));
  };

  // criteria getter/setter
  instance.criteria = function(options) {
    if(options === undefined) {
      return __criteria;
    } else {
      __criteria = options;
      this.trigger("onchange");
    }
  };

  // criteria getter/setter
  instance.filter = function(f) {
    if(f === undefined) {
      return __filter_f;
    } else {
      __filter = f;
      this.trigger("onchange");
    }
  };

  // filtered down version of the list
  instance.selection = function() {
    var result = [];
    var i = 0;
    var n = __list.length;

    for(i=0; i<n; i++) {
      if(__filter(__list[i], __criteria)) {
        result.push(__list[i]);
      }
    }

    return result;
  };

  instance.trigger = function(f) {
    this[f] && this[f]();
  };

  return instance;
};

