@Nullable
  public static <T> T getFile(final FilePathMerger<T> merger, final String path, final List<? super String> tail) {
    final String[] pieces = RelativePathCalculator.split(path);

    for (int i = 0; i < pieces.length; i++) {
      final String piece = pieces[i];
      if ("".equals(piece) || ".".equals(piece)) {
        continue;
      }
      if ("..".equals(piece)) {
        final boolean upResult = merger.up();
        if (! upResult) return null;
        continue;
      }

      final boolean downResult = merger.down(piece);
      if (! downResult) {
        if (tail != null) {
          tail.addAll(Arrays.asList(pieces).subList(i, pieces.length));
        }
        return merger.getResult();
      }
    }

    return merger.getResult();
  }
@Nullable
  public static <T> T getFile(final FilePathMerger<T> merger, final String path, final List<? super String> tail)