def changes(self):
        """
        Returns a mapping of items to their effective change objects which include the old values
        and the new. The mapping includes only items whose value or raw string value has changed in the context.
        """
        report = {}
        for k, k_changes in self._changes.items():
            if len(k_changes) == 1:
                report[k] = k_changes[0]
            else:
                first = k_changes[0]
                last = k_changes[-1]
                if first.old_value != last.new_value or first.old_raw_str_value != last.new_raw_str_value:
                    report[k] = _Change(
                        first.old_value,
                        last.new_value,
                        first.old_raw_str_value,
                        last.new_raw_str_value,
                    )
        return report
Returns a mapping of items to their effective change objects which include the old values
        and the new. The mapping includes only items whose value or raw string value has changed in the context.