public void visitToolName(Template toolWithValueTemplate, Template toolWithoutValueTemplate) {
   if (entry.value != null) {
     toolWithValueTemplate.accept(this);
   } else {
     toolWithoutValueTemplate.accept(this);
   }
 }
 public void visitService(Template serviceNotAvailableTemplate, Template serviceTemplate) {
   if (tools == null) {
     serviceNotAvailableTemplate.accept(this);
   } else {
     entry = rootEntry;
     serviceTemplate.accept(this);
   }
 }
 public void visitToolValue(Template toolValueTemplate) {
   if (entry.value != null) {
     toolValueTemplate.accept(this);
   }
 }
 public void visitSubTools(Template subToolsTemplate) {
   if (!entry.subEntries.isEmpty()) {
     subToolsTemplate.accept(this);
   }
 }
 public void visitToolHidden(Template toolHiddenTemplate) {
   if (entry.parentEntry && entry.value != null && visitedName.contains(entry.name)) {
     toolHiddenTemplate.accept(this);
   }
 }
 public void visitTool(Template toolTemplate) {
   for (Iterator<Entry> i = entry.subEntries.values().iterator(); i.hasNext(); ) {
     entry = i.next();
     toolTemplate.accept(this);
   }
 }