code: func (i Interception) Invoke(val reflect.Value, target *reflect.Value) reflect.Value {
  	var arg reflect.Value
  	if i.function == nil {
  		// If it's an InterceptorMethod, then we have to pass in the target type.
  		arg = *target
  	} else {
  		// If it's an InterceptorFunc, then the type must be *Controller.
  		// We can find that by following the embedded types up the chain.
  		for val.Type() != controllerPtrType {
  			if val.Kind() == reflect.Ptr {
  				val = val.Elem()
  			}
  			val = val.Field(0)
  		}
  		arg = val
  	}
  
  	vals := i.callable.Call([]reflect.Value{arg})
  	return vals[0]
  }
docs: // Invoke performs the given interception.
  // val is a pointer to the App Controller.