docs: public static Object beanClone(Object obj, Set<String> ignoreProperties) throws CloneNotSupportedException {
  
          final Class<?> clazz = obj.getClass();
  
          try {
  
              final Object clonedBean = clazz.newInstance();
  
              final List<PropertyDescriptor> propertyDescriptors = BeanIntrospector.getPropertyDescriptorsWithGettersAndSetters(clazz);
              for (final PropertyDescriptor propertyDescriptor : propertyDescriptors) {
  
                  final String propertyName = propertyDescriptor.getName();
  
                  final boolean ignoredProperty = ignoreProperties.contains(propertyName);
  
                  if (!ignoredProperty) {
  
                      final Method getter = propertyDescriptor.getReadMethod();
                      final Method setter = propertyDescriptor.getWriteMethod();
  
                      Object value = getter.invoke(obj, NO_PARAMS);
                      if (value != null) {
                          value = doClone(value);
                          setter.invoke(clonedBean, new Object[] { value });
                      }
  
                  }
  
              }
  
              return clonedBean;
  
          } catch (final CloneNotSupportedException e) {
              LOG.error("Error while cloning bean", e);
              throw e;
          } catch (final Exception e) {
              LOG.error("Error while cloning bean", e);
              throw new CloneNotSupportedException("Cannot clone a " + clazz + " object");
          }
  
      }