code: func KiteFromString(s string) (*Kite, error) {
  	if s == "" || s[0] != '/' {
  		return nil, errors.New("invalid kite string")
  	}
  
  	fields := make([]string, 7)
  	copy(fields, strings.SplitN(s[1:], "/", 7))
  
  	return &Kite{
  		Username:    fields[0],
  		Environment: fields[1],
  		Name:        fields[2],
  		Version:     fields[3],
  		Region:      fields[4],
  		Hostname:    fields[5],
  		ID:          fields[6],
  	}, nil
  }
docs: // KiteFromString returns a new Kite string from the given string
  // representation in the form of "/username/environment/...". It's the inverse
  // of k.String()