public void Edit(string key, ClientSettings settings)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }

            // Edit is only called after a client setup dialog
            // has returned.  At this point the client name
            // has already been validated.  Just make sure we
            // have a value here.
            Debug.Assert(!String.IsNullOrEmpty(settings.Name));

            IClient client;
            ClientEditedEventArgs e;

            _syncLock.EnterWriteLock();
            try
            {
                bool keyChanged = key != settings.Name;
                if (keyChanged && _clientDictionary.ContainsKey(settings.Name))
                {
                    // would like to eventually use the exact same
                    // exception message that would be used by
                    // the inner dictionary object.
                    throw new ArgumentException("An element with the same key already exists.");
                }

                client = _clientDictionary[key];
                string existingName = client.Settings.Name;
                string existingPath = client.Settings.DataPath();

                client.SlotsChanged      -= OnInvalidate;
                client.RetrievalFinished -= OnInvalidate;
                // update the settings
                client.Settings = settings;
                // if the key changed the client object needs removed and readded with the correct key
                if (keyChanged)
                {
                    _clientDictionary.Remove(key);
                    _clientDictionary.Add(settings.Name, client);
                }
                client.SlotsChanged      += OnInvalidate;
                client.RetrievalFinished += OnInvalidate;

                if (settings.IsFahClient() || settings.IsLegacy())
                {
                    e = new ClientEditedEventArgs(existingName, settings.Name, existingPath, settings.DataPath());
                }
                else
                {
                    // no External support yet
                    throw new InvalidOperationException("Client type is not supported.");
                }
            }
            finally
            {
                _syncLock.ExitWriteLock();
            }

            IsDirty = true;
            OnClientEdited(e);
            OnDictionaryChanged(new ConfigurationChangedEventArgs(ConfigurationChangedType.Edit, client));
        }