def _convert(self, desired_type: Type[T], source_obj: S, logger: Logger, options: Dict[str, Dict[str, Any]]) -> T:
try:<EOL><INDENT>if self.unpack_options:<EOL><INDENT>opts = self.get_applicable_options(options)<EOL>if self.function_args is not None:<EOL><INDENT>return self.conversion_method(desired_type, source_obj, logger, **self.function_args, **opts)<EOL><DEDENT>else:<EOL><INDENT>return self.conversion_method(desired_type, source_obj, logger, **opts)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>if self.function_args is not None:<EOL><INDENT>return self.conversion_method(desired_type, source_obj, logger, options, **self.function_args)<EOL><DEDENT>else:<EOL><INDENT>return self.conversion_method(desired_type, source_obj, logger, options)<EOL><DEDENT><DEDENT><DEDENT>except TypeError as e:<EOL><INDENT>raise CaughtTypeError.create(self.conversion_method, e)<EOL><DEDENT>
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: