Apply the converters of the chain in order to produce the desired result. Only the last converter will see the
        'desired type', the others will be asked to produce their declared to_type.

        :param desired_type:
        :param obj:
        :param logger:
        :param options:
        :return:

def _convert(self, desired_type: Type[T], obj: S, logger: Logger, options: Dict[str, Dict[str, Any]]) -> T:
        """
        Apply the converters of the chain in order to produce the desired result. Only the last converter will see the
        'desired type', the others will be asked to produce their declared to_type.

        :param desired_type:
        :param obj:
        :param logger:
        :param options:
        :return:
        """
        for converter in self._converters_list[:-1]:
            # convert into each converters destination type
            obj = converter.convert(converter.to_type, obj, logger, options)

        # the last converter in the chain should convert to desired type
        return self._converters_list[-1].convert(desired_type, obj, logger, options)