code: function property(state, path, data, newValue) {
    try {
      if (typeof path === 'string') {
        path = path.split('.');
      }
      var value = data[path[0]];
      if (path.length === 1) {
        if (newValue !== undefined) {
          data[path[0]] = newValue;
        }
        if (typeof value === 'function') {
          return value.bind(data);
        }
        return value;
      }
      if (!value) {
        handleError(state, '"' + path[0] + '" is undefined');
        return null;
      }
      return property(state, path.slice(1), value, newValue);
    }
    catch (ex) {
      handleError(state, 'Path error with \'' + path + '\'', ex);
      return '${' + path + '}';
    }
  }
docs: Combined getter and setter that works with a path through some data set.
  For example:
  <ul>
  <li>property(state, 'a.b', { a: { b: 99 }}); // returns 99
  <li>property(state, 'a', { a: { b: 99 }}); // returns { b: 99 }
  <li>property(state, 'a', { a: { b: 99 }}, 42); // returns 99 and alters the
  input data to be { a: { b: 42 }}
  </ul>
  @param path An array of strings indicating the path through the data, or
  a string to be cut into an array using <tt>split('.')</tt>
  @param data the data to use for node processing
  @param newValue (optional) If defined, this value will replace the
  original value for the data at the path specified.
  @return The value pointed to by <tt>path</tt> before any
  <tt>newValue</tt> is applied.