method register plugin ?plugin_aliases ?doc ?sdoc v =
    let plugin = if insensitive then String.uppercase plugin else plugin in
    let doc = match doc,sdoc with
      | (Some d), _ -> d
      | _, None -> Doc.trivial "(no doc)"
      | _, (Some s) -> Doc.trivial s
    in
      if duplicates then begin
        subsections <- (plugin,doc)::subsections ;
        plugins <- (plugin,v)::plugins
      end else begin
        subsections <-
          (plugin,doc)::(List.filter (fun (k,_) -> k<>plugin) subsections) ;
        plugins <- (plugin,v)::(List.filter (fun (k,_) -> k<>plugin) plugins)
      end ;
      register_hook (plugin,v);
      match plugin_aliases with
        | Some l -> 
            aliases <- (List.map (fun alias -> (alias, v)) l) @ aliases
        | None       -> ()