docs: public static <I extends AbstractItem & TopLevelItem> I move(I item, DirectlyModifiableTopLevelItemGroup destination) throws IOException, IllegalArgumentException {
          DirectlyModifiableTopLevelItemGroup oldParent = (DirectlyModifiableTopLevelItemGroup) item.getParent();
          if (oldParent == destination) {
              throw new IllegalArgumentException();
          }
          // TODO verify that destination is to not equal to, or inside, item
          if (!destination.canAdd(item)) {
              throw new IllegalArgumentException();
          }
          String name = item.getName();
          verifyItemDoesNotAlreadyExist(destination, name, null);
          String oldFullName = item.getFullName();
          // TODO AbstractItem.renameTo has a more baroque implementation; factor it out into a utility method perhaps?
          File destDir = destination.getRootDirFor(item);
          FileUtils.forceMkdir(destDir.getParentFile());
          FileUtils.moveDirectory(item.getRootDir(), destDir);
          oldParent.remove(item);
          I newItem = destination.add(item, name);
          item.movedTo(destination, newItem, destDir);
          ItemListener.fireLocationChange(newItem, oldFullName);
          return newItem;
      }