code: private T copyProperties(T source) {
          T target = createEmpty(source.getClass());
  
          Map<String, PropertyDescriptor> mapTargetProps = MappingUtils.mapPropertyDescriptors(target.getClass());
          Map<String, PropertyDescriptor> mapSourceProps = MappingUtils.mapPropertyDescriptors(source.getClass());
  
          Object value = null;
  
          for (String propertyName : mapSourceProps.keySet()) {
              value = MappingUtils.callGetter(source, mapSourceProps.get(propertyName));
  
              MappingUtils.callSetter(target, mapTargetProps.get(propertyName), value);
          }
  
          return target;
      }
docs: Creates empty bean {@link #createEmpty(Class)} and fills it with values
  from source effectively cloning it
  
  @param source source Bean which would be cloned
  @return cloned Bean