Whats the best way to run modular functions?

ie similiar to GAS effects which are Instanced Objects i think?

options i can think of,

  1. FunctionLibrary with switch statements but would get monolithic
  2. Call functions by Name but is error prone?
  3. Kinda same as 2. but i could have a TMap< FName, Delegate>.
  4. Instanced Objects, fine but seems wasteful for simple tasks.
  5. run on Object CDOs, my current method

or a slight combo where i run on CDOs but bundle some similar functions and switch on GameplayTag to keep the classes down.

Thoughts?