Yea, that's sort of how this code relies on having "functions" that accept other "functions" (technically classes/interfaces, as you said) to be able to operate on them. Because I can't just call func f(func g) as if func were a data type or anything of the sort. So instead I declared a new range of classes that are effectively functions.