code: @SuppressWarnings("unchecked")
      private <T> T getEmbeddedValue(final List<?> keys, final Class<T> clazz, final T defaultValue) {
          Object value = this;
          Iterator<?> keyIterator = keys.iterator();
          while (keyIterator.hasNext()) {
              Object key = keyIterator.next();
              value = ((Document) value).get(key);
              if (!(value instanceof Document)) {
                  if (value == null) {
                      return defaultValue;
                  } else if (keyIterator.hasNext()) {
                      throw new ClassCastException(format("At key %s, the value is not a Document (%s)",
                              key, value.getClass().getName()));
                  }
              }
          }
          return clazz != null ? clazz.cast(value) : (T) value;
      }
docs: Throws ClassCastException if any of the intermediate embedded values is not a Document.