/var/V = new /datum
V(1,2,list()) // V:Exec(1,2,list())
This would be useful for objects that act primarily as a wrapper for some function, or in general objects that have some function which is normally called Execute() or Start() or Run() or anything similar; for example, a pathfinding algorithm that stores the results in an object.
list/Exec() in this context would pass the call on to its contents, either skipping or throwing an error on non-datum entries:
/mob/list/error_handlers = newlist(/datum/logger, /datum/admin_notifier)
/mob/proc/test()
// for datum d in error_handlers:
// d.Exec()
error_handlers()
If you are going this far you might as well add function delegates but that's up to you. It would be nice to be able to have first-class function delegates, eg,
/mob/proc/test()
var/delegate/D = src.Login // standard mob proc
D()
The only other typesafe way to add delegates would use a full proc typepath:
var/delegate/D = delegate(src,/mob/proc/Login) // standard mob proc
The two are equivalent but it is difficult to read and write long typepaths repeatedly.