<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _convert(self, desired_type: Type[T], source_obj: S, logger: Logger, options: Dict[str, Dict[str, Any]]) -> T: """ Delegates to the user-provided method. Passes the appropriate part of the options according to the function name. :param desired_type: :param source_obj: :param logger: :param options: :return: """

        try:
            if self.unpack_options:
                opts = self.get_applicable_options(options)
                if self.function_args is not None:
                    return self.conversion_method(desired_type, source_obj, logger, **self.function_args, **opts)
                else:
                    return self.conversion_method(desired_type, source_obj, logger, **opts)
            else:
                if self.function_args is not None:
                    return self.conversion_method(desired_type, source_obj, logger, options, **self.function_args)
                else:
                    return self.conversion_method(desired_type, source_obj, logger, options)

        except TypeError as e:
            raise CaughtTypeError.create(self.conversion_method, e)