/**
   * Recursively-copies properties from the Object, up the inheritance hierarchy, to the destination
   * Resource.
   *
   * @param type the Type of the object being copied. May be a super-type of the 'from' object.
   * @param from the instance of Object being copied.
   * @param to the destination Resource instance.
   */
  private void copyProperties0(Class<?> type, Object from, Resource to) {
    if (type == null) return;
    if (Resource.class.isAssignableFrom(type)) {
      to.from((Resource) from);
      return;
    }

    Field[] fields = getDeclaredFields(type);

    try {
      for (Field f : fields) {
        if (isIncluded(f)) {
          f.setAccessible(true);
          Object value = f.get(from);

          if (value != null) {
            addProperty(to, f, value);
          }
        }
      }
    } catch (IllegalAccessException e) {
      throw new ResourceException(e);
    }

    copyProperties0(type.getSuperclass(), from, to);
  }