code: def append(self, child, *args, **kwargs):
          
          #Accept Word instances instead of WordReference, references will be automagically used upon serialisation
          if isinstance(child, (Word, Morpheme, Phoneme)) and WordReference in self.ACCEPTED_DATA:
              #We don't really append but do an insertion so all references are in proper order
              insertionpoint = len(self.data)
              for i, sibling in enumerate(self.data):
                  if isinstance(sibling, (Word, Morpheme, Phoneme)):
                      try:
                          if not sibling.precedes(child):
                              insertionpoint = i
                      except: #happens if we can't determine common ancestors
                          pass
  
              self.data.insert(insertionpoint, child)
              return child
          elif isinstance(child, AbstractSpanAnnotation): #(covers span roles just as well)
              insertionpoint = len(self.data)
              try:
                  firstword = child.wrefs(0)
              except IndexError:
                  #we have no basis to determine an insertionpoint for this child, just append it then
                  return super(AbstractSpanAnnotation,self).append(child, *args, **kwargs)
  
              insertionpoint = len(self.data)
              for i, sibling in enumerate(self.data):
                  if isinstance(sibling, (Word, Morpheme, Phoneme)):
                      try:
                          if not sibling.precedes(firstword):
                              insertionpoint = i
                      except: #happens if we can't determine common ancestors
                          pass
              return super(AbstractSpanAnnotation,self).insert(insertionpoint, child, *args, **kwargs)
          else:
              return super(AbstractSpanAnnotation,self).append(child, *args, **kwargs)
docs: See :meth:`AbstractElement.append`