// ========================================================================== // Project: SproutCore Costello - Property Observing Library // Copyright: ©2006-2011 Strobe Inc. and contributors. // Portions ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ==========================================================================

/**

@class

*/ SC.Function = /** @scope SC.Function.prototype */{

/**
  @see Function.prototype.property
*/
property: function (fn, keys) {
  fn.dependentKeys = SC.$A(keys);
  var guid = SC.guidFor(fn);
  fn.cacheKey = "__cache__" + guid;
  fn.lastSetValueKey = "__lastValue__" + guid;
  fn.isProperty = true;
  return fn;
},

/**
  @see Function.prototype.cacheable
*/
cacheable: function (fn, aFlag) {
  fn.isProperty = true;  // also make a property just in case
  if (!fn.dependentKeys) fn.dependentKeys = [];
  fn.isCacheable = (aFlag === undefined) ? true : aFlag;
  return fn;
},

/**
  @see Function.prototype.idempotent
*/
idempotent: function (fn, aFlag) {
  fn.isProperty = true;  // also make a property just in case
  if (!fn.dependentKeys) this.dependentKeys = [];
  fn.isVolatile = (aFlag === undefined) ? true : aFlag;
  return fn;
},

/**
  @see Function.prototype.enhance
*/
enhance: function (fn) {
  fn.isEnhancement = true;
  return fn;
},

/**
  @see Function.prototype.observes
*/
observes: function (fn, propertyPaths) {
  // sort property paths into local paths (i.e just a property name) and
  // full paths (i.e. those with a . or * in them)
  var loc = propertyPaths.length, local = null, paths = null;
  while (--loc >= 0) {
    var path = propertyPaths[loc];
    // local
    if ((path.indexOf('.') < 0) && (path.indexOf('*') < 0)) {
      if (!local) local = fn.localPropertyPaths = [];
      local.push(path);

    // regular
    } else {
      if (!paths) paths = fn.propertyPaths = [];
      paths.push(path);
    }
  }
  return fn;
}

};