code: def getKerningMutator(self, pairs=None):
          
          if self._kerningMutator and pairs == self._kerningMutatorPairs:
              return self._kerningMutator
          kerningItems = []
          if pairs is None:
              for sourceDescriptor in self.sources:
                  if sourceDescriptor.layerName is not None:
                      continue
                  if not sourceDescriptor.muteKerning:
                      loc = Location(sourceDescriptor.location)
                      sourceFont = self.fonts[sourceDescriptor.name]
                      if sourceFont is None: continue
                      # this makes assumptions about the groups of all sources being the same.
                      kerningItems.append((loc, self.mathKerningClass(sourceFont.kerning, sourceFont.groups)))
          else:
              self._kerningMutatorPairs = pairs
              for sourceDescriptor in self.sources:
                  # XXX check sourceDescriptor layerName, only foreground should contribute
                  if sourceDescriptor.layerName is not None:
                      continue
                  if not os.path.exists(sourceDescriptor.path):
                      continue
                  if not sourceDescriptor.muteKerning:
                      sourceFont = self.fonts[sourceDescriptor.name]
                      if sourceFont is None:
                          continue
                      loc = Location(sourceDescriptor.location)
                      # XXX can we get the kern value from the fontparts kerning object?
                      kerningItem = self.mathKerningClass(sourceFont.kerning, sourceFont.groups)
                      sparseKerning = {}
                      for pair in pairs:
                          v = kerningItem.get(pair)
                          if v is not None:
                              sparseKerning[pair] = v
                      kerningItems.append((loc, self.mathKerningClass(sparseKerning)))
          bias, self._kerningMutator = self.getVariationModel(kerningItems, axes=self.serializedAxes, bias=self.newDefaultLocation())
          return self._kerningMutator
docs: Return a kerning mutator, collect the sources, build mathGlyphs.
              If no pairs are given: calculate the whole table.
              If pairs are given then query the sources for a value and make a mutator only with those values.