{
    int collectionSize = end - start;
    if (collectionSize == 0)
    {
      return false;
    }
    else
    {
      if (isNotificationRequired())
      {
        boolean oldIsSet = isSet();
        doAddAllUnique(index, objects, start, end);
        NotificationImpl notification;
        if (collectionSize == 1)
        {
          notification = createNotification(Notification.ADD, null, objects[0], index, oldIsSet);
        }
        else
        {
          if (start != 0 || end != objects.length)
          {
            Object [] actualObjects = new Object [collectionSize];
            for (int i = 0, j = start; j < end; ++i, ++j)
            {
              actualObjects[i] = objects[j];
            }
            notification = createNotification(Notification.ADD_MANY, null, Arrays.asList(actualObjects), index, oldIsSet);
          }
          else
          {
            notification =  createNotification(Notification.ADD_MANY, null, Arrays.asList(objects), index, oldIsSet);
          }
        }
        if (hasInverse())
        {
          NotificationChain notifications = createNotificationChain(collectionSize);
          int lastIndex = index + collectionSize;
          for (int i = index; i < lastIndex; ++i)
          {            
            @SuppressWarnings("unchecked") E value = (E)data[i];
            notifications = inverseAdd(value, notifications);
            notifications = shadowAdd(value, notifications);
          }
          if (notifications == null)
          {
            dispatchNotification(notification);
          }
          else
          {
            notifications.add(notification);
            notifications.dispatch();
          }
        }
        else
        {
          dispatchNotification(notification);
        }
      }
      else
      {
        doAddAllUnique(index, objects, start, end);
        if (hasInverse())
        {
          NotificationChain notifications = createNotificationChain(collectionSize);
          int lastIndex = index + collectionSize;
          for (int i = index; i < lastIndex; ++i)
          {            
            @SuppressWarnings("unchecked") E object = (E)data[i];
            notifications = inverseAdd(object, notifications);
          }
          if (notifications != null) notifications.dispatch();
        }
      }

      return true;
    }
  }