code: function runBindingEffect(inst, path, props, oldProps, info, hasPaths, nodeList) {
    let node = nodeList[info.index];
    let binding = info.binding;
    let part = info.part;
    // Subpath notification: transform path and set to client
    // e.g.: foo="{{obj.sub}}", path: 'obj.sub.prop', set 'foo.prop'=obj.sub.prop
    if (hasPaths && part.source && (path.length > part.source.length) &&
        (binding.kind == 'property') && !binding.isCompound &&
        node.__isPropertyEffectsClient &&
        node.__dataHasAccessor && node.__dataHasAccessor[binding.target]) {
      let value = props[path];
      path = translate(part.source, binding.target, path);
      if (node._setPendingPropertyOrPath(path, value, false, true)) {
        inst._enqueueClient(node);
      }
    } else {
      let value = info.evaluator._evaluateBinding(inst, part, path, props, oldProps, hasPaths);
      // Propagate value to child
      applyBindingValue(inst, node, binding, part, value);
    }
  }
docs: Implements the "binding" (property/path binding) effect.
  
  Note that binding syntax is overridable via `_parseBindings` and
  `_evaluateBinding`.  This method will call `_evaluateBinding` for any
  non-literal parts returned from `_parseBindings`.  However,
  there is no support for _path_ bindings via custom binding parts,
  as this is specific to Polymer's path binding syntax.
  
  @param {!PropertyEffectsType} inst The instance the effect will be run on
  @param {string} path Name of property
  @param {Object} props Bag of current property changes
  @param {Object} oldProps Bag of previous values for changed properties
  @param {?} info Effect metadata
  @param {boolean} hasPaths True with `props` contains one or more paths
  @param {Array} nodeList List of nodes associated with `nodeInfoList` template
  metadata
  @return {void}
  @private