Minor question: why use `*args` and `**kwargs` rather than just passing in a list for `args` and a dict for `kwargs`?  It would clean up some of the logic for calling `func_wrapper` below inside `apply`.