private List<String> getReformatedPieces(String in, PieceMarkerSpec[] markers) {
    CodeReformatorKernel kernel =
        new CodeReformatorKernel(_statementSeparator, markers, _commentSpecs);
    String[] pieces = kernel.toPieces(in);
    ArrayList<String> piecesBuf = new ArrayList<String>();

    for (int i = 0; i < pieces.length; ++i) {
      if (TRY_SPLIT_LINE_LEN < pieces[i].length()) {
        String[] splitPieces = trySplit(pieces[i], 0, TRY_SPLIT_LINE_LEN);
        piecesBuf.addAll(Arrays.asList(splitPieces));
      } else {
        piecesBuf.add(pieces[i]);
      }
    }
    return piecesBuf;
  }
  private String[] trySplit(String piece, int braketDepth, int trySplitLineLen) {
    String trimmedPiece = piece.trim();
    CodeReformatorKernel dum =
        new CodeReformatorKernel(_statementSeparator, new PieceMarkerSpec[0], _commentSpecs);

    if (hasTopLevelColon(trimmedPiece, dum)) {
      PieceMarkerSpec[] pms = createPieceMarkerSpecIncludeColon();
      CodeReformatorKernel crk = new CodeReformatorKernel(_statementSeparator, pms, _commentSpecs);
      String[] splitPieces1 = crk.toPieces(trimmedPiece);
      if (1 == splitPieces1.length) {
        return splitPieces1;
      }

      ArrayList<String> ret = new ArrayList<String>();

      for (int i = 0; i < splitPieces1.length; ++i) {
        if (trySplitLineLen < splitPieces1[i].length() + braketDepth * INDENT.length()) {
          String[] splitPieces2 = trySplit(splitPieces1[i], braketDepth, trySplitLineLen);
          for (int j = 0; j < splitPieces2.length; ++j) {
            ret.add(splitPieces2[j].trim());
          }
        } else {
          ret.add(splitPieces1[i].trim());
        }
      }
      return (purgeEmptyStrings(ret)).toArray(new String[0]);
    } else {
      int[] tlbi = getTopLevelBraketIndexes(trimmedPiece, dum);
      if (-1 != tlbi[0] && tlbi[0] < tlbi[1]) {
        // ////////////////////////////////////////////////////////////////////////
        // Split the first two matching toplevel brakets here
        PieceMarkerSpec[] pms = createPieceMarkerSpecExcludeColon();
        CodeReformatorKernel crk =
            new CodeReformatorKernel(_statementSeparator, pms, _commentSpecs);
        String[] splitPieces1 = crk.toPieces(trimmedPiece.substring(tlbi[0] + 1, tlbi[1]));

        ArrayList<String> buf = new ArrayList<String>();
        buf.add(trimmedPiece.substring(0, tlbi[0]).trim());
        buf.add("(");
        for (int i = 0; i < splitPieces1.length; ++i) {
          buf.add(splitPieces1[i]);
        }
        buf.add(")");
        if (tlbi[1] + 1 < trimmedPiece.length()) {
          buf.add(trimmedPiece.substring(tlbi[1] + 1, trimmedPiece.length()).trim());
        }
        splitPieces1 = buf.toArray(new String[0]);
        //
        // ////////////////////////////////////////////////////////////////////

        // ///////////////////////////////////////////////////////////////////
        // Now check length of Strings in splitPieces1 again
        ArrayList<String> ret = new ArrayList<String>();
        for (int i = 0; i < splitPieces1.length; ++i) {
          if (trySplitLineLen < splitPieces1[i].length() + braketDepth * INDENT.length()) {
            String[] splitPieces2 = trySplit(splitPieces1[i], braketDepth + 1, trySplitLineLen);
            for (int j = 0; j < splitPieces2.length; ++j) {
              ret.add(splitPieces2[j]);
            }
          } else {
            ret.add(splitPieces1[i]);
          }
        }
        //
        // ///////////////////////////////////////////////////////////////////

        return (purgeEmptyStrings(ret)).toArray(new String[0]);
      } else {
        return new String[] {piece};
      }
    }
  }