code: function _$computed (propname, deps, getFn, setFn, enumerable) {
          /**
           *  property is exist
           */
          if ($indexOf(_computedKeys, propname)) return
  
          _computedKeys.push(propname)
          _computedProps[propname] = {
              'deps': deps, 
              'get': getFn,
              'set': setFn
          }
  
          /**
           *  Add to dependence-property mapping
           */
          ;(deps || []).forEach(function (dep) {
              while(dep) {
                  _prop2CptDepsMapping(propname, dep)
                  dep = $keypath.digest(dep)
              }
          })
          /**
           *  define getter
           */
          $util.patch(_cptCaches, propname, {})
          var dest = _cptCaches[propname]
          dest.cur = getFn ? getFn.call(_computedCtx, model):undefined
  
          $util.def(model, propname, {
              enumerable: enumerable === undefined ? true : !!enumerable,
              get: function () {
                  return dest.cur
              },
              set: function () {
                  setFn && setFn.apply(_computedCtx, arguments)
              }
          })
          // emit change event when define
          _emitChange(propname, dest.cur)
      }
docs: define computed prop/props of this model
  @param propname <String> property name
  @param deps <Array> computed property dependencies
  @param get <Function> computed property getter
  @param set <Function> computed property setter
  @param enumerable <Boolean> whether property enumerable or not