def METHOD_NAME(self, file: File, func: Callable, executor: str) -> Callable:
    """This will give staging providers the chance to wrap (or replace entirely!) the task function."""
    executor_obj = self.dfk.executors[executor]
    if hasattr(executor_obj, "storage_access") and executor_obj.storage_access is not None:
        storage_access = executor_obj.storage_access
    else:
        storage_access = default_staging
    for provider in storage_access:
        logger.debug("stage_in checking Staging provider {}".format(provider))
        if provider.can_stage_in(file):
            newfunc = provider.METHOD_NAME(self, executor, file, func)
            if newfunc:
                return newfunc
            else:
                return func
    logger.debug("reached end of staging provider list")
    # if we reach here, we haven't found a suitable staging mechanism
    raise ValueError("Executor {} cannot stage file {}".format(executor, repr(file)))