docs: def readSources(self):
          """ Read the source elements.
  
          ::
  
              <source filename="LightCondensed.ufo" location="location-token-aaa" name="master-token-aaa1">
                  <info mute="1" copy="1"/>
                  <kerning mute="1"/>
                  <glyph mute="1" name="thirdGlyph"/>
              </source>
  
          """
          for sourceCount, sourceElement in enumerate(self.root.findall(".sources/source")):
              # shall we just read the UFO here?
              filename = sourceElement.attrib.get('filename')
              # filename is a path relaive to the documentpath. resolve first.
              sourcePath = os.path.abspath(os.path.join(os.path.dirname(self.path), filename))
              sourceName = sourceElement.attrib.get('name')
              if sourceName is None:
                  # if the source element has no name attribute
                  # (some authoring tools do not need them)
                  # then we should make a temporary one. We still need it for reference.
                  sourceName = "temp_master.%d"%(sourceCount)
              self.reportProgress("prep", 'load', sourcePath)
              if not os.path.exists(sourcePath):
                  raise MutatorError("Source not found at %s"%sourcePath)
              sourceObject = self._instantiateFont(sourcePath)
              # read the locations
              sourceLocationObject = None
              sourceLocationObject = self.locationFromElement(sourceElement)
  
              if sourceLocationObject is None:
                 raise MutatorError("No location defined for source %s"%sourceName)
  
              # read lib flag
              for libElement in sourceElement.findall('.lib'):
                  if libElement.attrib.get('copy') == '1':
                      self.libSource = sourceName
  
              # read the groups flag
              for groupsElement in sourceElement.findall('.groups'):
                  if groupsElement.attrib.get('copy') == '1':
                      self.groupsSource = sourceName
  
              # read the info flag
              for infoElement in sourceElement.findall(".info"):
                  if infoElement.attrib.get('copy') == '1':
                      self.infoSource = sourceName
                  if infoElement.attrib.get('mute') == '1':
                      self.muted['info'].append(sourceName)
  
              # read the features flag
              for featuresElement in sourceElement.findall(".features"):
                  if featuresElement.attrib.get('copy') == '1':
                      if self.featuresSource is not None:
                          self.featuresSource = None
                      else:
                          self.featuresSource = sourceName
  
              mutedGlyphs = []
              for glyphElement in sourceElement.findall(".glyph"):
                  glyphName = glyphElement.attrib.get('name')
                  if glyphName is None:
                      continue
                  if glyphElement.attrib.get('mute') == '1':
                      if not sourceName in self.muted['glyphs']:
                          self.muted['glyphs'][sourceName] = []
                      self.muted['glyphs'][sourceName].append(glyphName)
  
              for kerningElement in sourceElement.findall(".kerning"):
                  if kerningElement.attrib.get('mute') == '1':
                      self.muted['kerning'].append(sourceName)
  
              # store
              self.sources[sourceName] = sourceObject, sourceLocationObject
              self.reportProgress("prep", 'done')