public void add(final OIdentifiable identifiable) {
    if (identifiable == null)
      throw new NullPointerException("Impossible to add a null identifiable in a ridbag");
    if (identifiable.getIdentity().isValid()) {
      Change counter = changes.get(identifiable);
      if (counter == null) changes.put(identifiable, new DiffChange(1));
      else {
        if (counter.isUndefined()) {
          counter = getAbsoluteValue(identifiable);
          changes.put(identifiable, counter);
        }
        counter.increment();
      }
    } else {
      final OModifiableInteger counter = newEntries.get(identifiable);
      if (counter == null) newEntries.put(identifiable, new OModifiableInteger(1));
      else counter.increment();
    }

    if (size >= 0) size++;

    if (this.owner != null) ORecordInternal.track(this.owner, identifiable);

    if (updateOwner)
      fireCollectionChangedEvent(
          new OMultiValueChangeEvent<OIdentifiable, OIdentifiable>(
              OMultiValueChangeEvent.OChangeType.ADD, identifiable, identifiable, null, false));
  }
 /**
  * Removes entry with given key from {@link #newEntries}.
  *
  * @param identifiable key to remove
  * @return true if entry have been removed
  */
 private boolean removeFromNewEntries(final OIdentifiable identifiable) {
   OModifiableInteger counter = newEntries.get(identifiable);
   if (counter == null) return false;
   else {
     if (counter.getValue() == 1) newEntries.remove(identifiable);
     else counter.decrement();
     return true;
   }
 }