def sort(self):
        """
        Sort triggers and their associated responses
        """
        # Sort triggers by word and character length first
        for priority, triggers in self._triggers.items():
            self._log.debug('Sorting priority {priority} triggers'.format(priority=priority))

            # Get and sort our atomic and wildcard patterns
            atomics = [trigger for trigger in triggers if trigger.pattern_is_atomic]
            wildcards = [trigger for trigger in triggers if not trigger.pattern_is_atomic]

            atomics = sorted(atomics, key=lambda trigger: (trigger.pattern_words, trigger.pattern_len), reverse=True)
            wildcards = sorted(wildcards, key=lambda trigger: (trigger.pattern_words, trigger.pattern_len),
                               reverse=True)

            # Replace our sorted triggers
            self._triggers[priority] = atomics + wildcards

        # Finally, sort triggers by priority
        self._sorted_triggers = []

        for triggers in [self._triggers[priority] for priority in sorted(self._triggers.keys(), reverse=True)]:
            for trigger in triggers:
                self._sorted_triggers.append(trigger)

        self.sorted = True
Sort triggers and their associated responses