Uses spread operator instead of fn.apply(fn, args)