code: func (s *Service) About(w http.ResponseWriter, r *http.Request) {
  	var about struct {
  		Methods []string
  		Types   []string
  	}
  
  	seen := make(map[string]bool)
  
  	f := reflect.TypeOf((*soap.HasFault)(nil)).Elem()
  
  	for _, obj := range Map.objects {
  		kind := obj.Reference().Type
  		if seen[kind] {
  			continue
  		}
  		seen[kind] = true
  
  		about.Types = append(about.Types, kind)
  
  		t := reflect.TypeOf(obj)
  		for i := 0; i < t.NumMethod(); i++ {
  			m := t.Method(i)
  			if seen[m.Name] {
  				continue
  			}
  			seen[m.Name] = true
  
  			in := m.Type.NumIn()
  			if in < 2 || in > 3 { // at least 2 params (receiver and request), optionally a 3rd param (context)
  				continue
  			}
  			if m.Type.NumOut() != 1 || m.Type.Out(0) != f { // all methods return soap.HasFault
  				continue
  			}
  
  			about.Methods = append(about.Methods, strings.Replace(m.Name, "Task", "_Task", 1))
  		}
  	}
  
  	sort.Strings(about.Methods)
  	sort.Strings(about.Types)
  
  	w.Header().Set("Content-Type", "application/json")
  	enc := json.NewEncoder(w)
  	enc.SetIndent("", "  ")
  	_ = enc.Encode(&about)
  }
docs: // About generates some info about the simulator.