@Override
  @SuppressWarnings("unchecked")
  public TableCell<S, T> call(TableColumn<S, T> p) {
    TableCell<S, T> cell =
        new TableCell<S, T>() {

          @Override
          public void updateItem(Object item, boolean empty) {
            if (item == getItem()) {
              return;
            }
            super.updateItem((T) item, empty);
            if (item == null) {
              super.setText(null);
              super.setGraphic(null);
            } else if (format != null) {
              super.setText(format.format(item));
            } else if (item instanceof Node) {
              super.setText(null);
              super.setGraphic((Node) item);
            } else {
              super.setText(item.toString());
              super.setGraphic(null);
            }
          }
        };
    cell.setTextAlignment(alignment);
    switch (alignment) {
      case CENTER:
        cell.setAlignment(Pos.CENTER);
        break;
      case RIGHT:
        cell.setAlignment(Pos.CENTER_RIGHT);
        break;
      default:
        cell.setAlignment(Pos.CENTER_LEFT);
        break;
    }
    return cell;
  }