docs: def upsert(self, key, value, entry):
          '''Update or Insert an entry into the list of dictionaries.
  
          If a dictionary in the list is found where key matches the value, then
             the FIRST matching list entry is replaced with entry
          else
             the entry is appended to the end of the list.
  
          The new entry is not examined in any way. It is, in fact, possible
          to upsert an entry that does not match the supplied key/value.
  
          Example of use:
  
          >>> test = [
          ...    {"name": "Jim",   "age": 18, "income": 93000, "wigs": 68       },
          ...    {"name": "Larry", "age": 18,                  "wigs": [3, 2, 9]},
          ...    {"name": "Joe",   "age": 20, "income": 15000, "wigs": [1, 2, 3]},
          ...    {"name": "Bill",  "age": 19, "income": 29000                   },
          ... ]
          >>> entryA = {"name": "Willie", "age": 77}
          >>> myPLOD = PLOD(test)
          >>> print myPLOD.upsert("name", "Willie", entryA).returnString()
          [
              {age: 18, income: 93000, name: 'Jim'   , wigs:        68},
              {age: 18, income: None , name: 'Larry' , wigs: [3, 2, 9]},
              {age: 20, income: 15000, name: 'Joe'   , wigs: [1, 2, 3]},
              {age: 19, income: 29000, name: 'Bill'  , wigs: None     },
              {age: 77, income: None , name: 'Willie', wigs: None     }
          ]
          >>> entryB = {"name": "Joe", "age": 20, "income": 30, "wigs": [3, 2, 9]}
          >>> print myPLOD.upsert("name", "Joe", entryB).returnString()
          [
              {age: 18, income: 93000, name: 'Jim'   , wigs:        68},
              {age: 18, income: None , name: 'Larry' , wigs: [3, 2, 9]},
              {age: 20, income:    30, name: 'Joe'   , wigs: [3, 2, 9]},
              {age: 19, income: 29000, name: 'Bill'  , wigs: None     },
              {age: 77, income: None , name: 'Willie', wigs: None     }
          ]
  
          :param key:
             The dictionary key to examine.
          :param value:
             The value to search for as referenced by the key.
          :param entry:
             The replacement (or new) entry for the list.
          :returns:
             class
          '''
          index=internal.get_index(self.table, key, self.EQUAL, value)
          if index is None:
              self.index_track.append(len(self.table))
              self.table.append(entry)
          else:
              self.table[index]=entry
          return self