@Override
        public void setValueAt(Object value, int row, int col) {
            if (data != null) {
                Boolean readOnly = (Boolean) getYProperty().get(YIComponent.READ_ONLY);
                if (readOnly == null || !readOnly.booleanValue()) {
                    Object rowObject = data.get(row);
                    String fieldName = (String) columns[col].
                        getYProperty().get(YIComponent.MVC_NAME);
                    
                    if (fieldName == null) {
                        // the column is not connected to any special POJO field, updating the whole row POJO:
                        // checking if value has truly changed:
                        if (ObjectUtils.equals(rowObject, value)) {
                            return;
                        }
                        data.set(row, value);
                        YTable.this.modelCollection.remove(rowObject);
                        YTable.this.modelCollection.add(value);
                    } else {
                        // setting value into the row POJO
                        // checking if value has truly changed:
                        try {
                            if (ObjectUtils.equals(value, 
                                    YCoreToolkit.getBeanValue(rowObject, fieldName))) {
                                return;
                            }
                        } catch (Exception ex) {
                            controller.modelGetValueFailed(new YModelGetValueException(ex, YTable.this));
                        }

                        try {
                            YCoreToolkit.setBeanValue(rowObject, fieldName, value);
                        } catch (Exception ex) {
                            controller.modelSetValueFailed(new YModelSetValueException(ex,
                                    YTable.this, value));
                        }
                    }
                    YTable.this.lastEditedRow = row;
                    YTable.this.lastEditedColumn = col;
                    autoInsertCancel = false; // cell has been changed, not cancelling auto-insert row
                    // triggering ContentChanged event:
                    String methodName = YUIToolkit.createMVCMethodName(YTable.this, "Changed");
                    Object[] params = {new YTableChangeData(row, col, value)};
                    
                    Class[] paramClasses = {YTableChangeData.class};
                    controller.invokeMethodIfFound(methodName, params, paramClasses);
                    
                    controller.updateModelAndController(YTable.this);
                }
                fireTableCellUpdated(row, col);
            }
        }