code: function (val, prop, parent, Ob, List) {
              Ob = Ob || Observe;
              List = List || Observe.List;
  
              // If it's an `array` make a list, otherwise a val.
              if (val instanceof Observe) {
                  // We have an `observe` already...
                  // Make sure it is not listening to this already
                  unhookup([val], parent._cid);
              } else if (can.isArray(val)) {
                  val = new List(val);
              } else {
                  val = new Ob(val);
              }
  
              // Listen to all changes and `batchTrigger` upwards.
              val.bind("change" + parent._cid, function () {
                  // `batchTrigger` the type on this...
                  var args = can.makeArray(arguments),
                      ev = args.shift();
                  args[0] = (prop === "*" ? [parent.indexOf(val), args[0]] : [prop, args[0]]).join(".");
  
                  // track objects dispatched on this observe
                  ev.triggeredNS = ev.triggeredNS || {};
  
                  // if it has already been dispatched exit
                  if (ev.triggeredNS[parent._cid]) {
                      return;
                  }
  
                  ev.triggeredNS[parent._cid] = true;
                  // send change event with modified attr to parent
                  can.trigger(parent, ev, args);
                  // send modified attr event to parent
                  //can.trigger(parent, args[0], args);
              });
  
              return val;
          }
docs: ## can/observe/observe.js ## observe.js `can.Observe` _Provides the observable pattern for JavaScript Objects._ Returns `true` if something is an object with properties of its own.