Refactor IFunction implementations, using self