code: func (m *Meta) setField(k string, v starlark.Value) (err error) {
  	ptr := m.fieldsMap()[k]
  	if ptr == nil {
  		return fmt.Errorf("set_meta: no such meta key %q", k)
  	}
  
  	// On success, mark the field as modified.
  	defer func() {
  		if err == nil {
  			m.touch(ptr)
  		}
  	}()
  
  	switch ptr := ptr.(type) {
  	case *string:
  		if str, ok := v.(starlark.String); ok {
  			*ptr = str.GoString()
  			return nil
  		}
  		return fmt.Errorf("set_meta: got %s, expecting string", v.Type())
  
  	case *bool:
  		if b, ok := v.(starlark.Bool); ok {
  			*ptr = bool(b)
  			return nil
  		}
  		return fmt.Errorf("set_meta: got %s, expecting bool", v.Type())
  
  	case *[]string:
  		if iterable, ok := v.(starlark.Iterable); ok {
  			iter := iterable.Iterate()
  			defer iter.Done()
  
  			var vals []string
  			for x := starlark.Value(nil); iter.Next(&x); {
  				if str, ok := x.(starlark.String); ok {
  					vals = append(vals, str.GoString())
  				} else {
  					return fmt.Errorf("set_meta: got %s, expecting string", x.Type())
  				}
  			}
  
  			*ptr = vals
  			return nil
  		}
  		return fmt.Errorf("set_meta: got %s, expecting an iterable", v.Type())
  
  	default:
  		panic("impossible")
  	}
  }
docs: // setField sets the field k to v.