public <T extends __>
  Generic<T> root(String name, EnumSet<EOpt> opts) {
    return new Generic<T>(name, null, opts);
  }
@Test
  void testGeneric() {
    PrintWriter out = spy(new PrintWriter(System.out));
    HamletImpl hi = new HamletImpl(out, 0, false);
    hi.
        root("start")._attr("name", "value").
        __("start text").
        elem("sub")._attr("name", "value").
        __("sub text").__().
        elem("sub1")._noEndTag()._attr("boolean", null).
        __("sub1text").__().
        __("start text2").
        elem("pre")._pre().
        __("pre text").
        elem("i")._inline().__("inline").__().__().
        elem("i")._inline().__("inline after pre").__().
        __("start text3").
        elem("sub2").
        __("sub2text").__().
        elem("sub3")._noEndTag().
        __("sub3text").__().
        elem("sub4")._noEndTag().
        elem("i")._inline().__("inline").__().
        __("sub4text").__().__();

    out.flush();
    assertEquals(0, hi.nestLevel);
    assertEquals(20, hi.indents);
    verify(out).print("<start");
    verify(out, times(2)).print(" name=\"value\"");
    verify(out).print(" boolean");
    verify(out).print("</start>");
    verify(out, never()).print("</sub1>");
    verify(out, never()).print("</sub3>");
    verify(out, never()).print("</sub4>");
  }