code: function _$sync(kp, value, lazyEmit) {
          var parts = $normalize(kp).split('.')
          var prop = parts[0]
  
          if ($indexOf(_computedKeys, prop)) {
              // since Mux@2.4.0 computed property support setter
              model[prop] = value
              return
          }
          if (!$indexOf(_observableKeys, prop)) {
              $warn('Property "' + prop + '" has not been observed')
              // return false means sync prop fail
              return
          }
          var pv = $keypath.get(_props, kp)
          var isObj = instanceOf(value, Object)
          var nKeypath = parts.join('.')
          var name = parts.pop()
          var parentPath = parts.join('.')
          var parent = $keypath.get(_props, parentPath)
          var isParentObserved = instanceOf(parent, Mux)
          var changed
          if (isParentObserved) {
              if ($hasOwn(parent, name)) {
                  changed = parent._$set(name, value, lazyEmit)
              } else {
                  parent._$add(name, value, lazyEmit)
                  changed = [$keypath.join(_rootPath(), kp), value]
              }
          } else {
              $keypath.set(
                  _props, 
                  kp, 
                  isObj
                      ? _walk(name, value, $join(_rootPath(), nKeypath))
                      : value
              )
              if ($util.diff(value, pv)) {
                  if (!lazyEmit) {
                      _emitChange(kp, value, pv)
                  } else {
                      changed = [$keypath.join(_rootPath(), kp), value, pv]
                  }
              }
          }
          return changed
      }
docs: ***********************************************************
  Function name start of "_$" are expose methods
  *********************************************************** 
  Set key-value pair to private model's property-object
  @param kp <String> keyPath
  @return <Object> diff object