code: private Object getValue(Object object, String propertyPath) throws TemplateException
    {
      if(this.model == null) {
        return null;
      }
  
      // anonymous property path has only a dot
      if(propertyPath.equals(".")) {
        return object;
      }
  
      Object o = object;
      if(propertyPath.charAt(0) == '.') {
        o = this.model;
        propertyPath = propertyPath.substring(1);
      }
      for(String property : propertyPath.split("\\.")) {
        o = getObjectProperty(o, property);
        if(o == null) {
          return null;
        }
      }
      return o;
    }
docs: Get content value. This method consider object as a graph of values and property path as a list of path components
  separated by dots and uses next logic to retrieve requested value:
  <ul>
  <li>if property path is anonymous, i.e. is exactly ".", returns given object itself,
  <li>if property path is absolute, starts with ".", uses content root object and transform the path as relative,
  <li>split property path and traverse all path components returning last found object.
  </ul>
  Value can be about anything: primitives or aggregates. Anyway, there is distinction between not found value and a
  null one. First condition is known as undefined value and throws content exception; null value denotes an existing
  one but not initialized. Finally, this method uses {@link #getObjectProperty(Object, String)} to actually process
  path components in sequence.
  
  @param object instance to use if property path is relative,
  @param propertyPath object property path.
  @return requested content value or null.
  @throws TemplateException if requested value is undefined.