/// <summary>
        /// Adds a plugin source to the repository.
        /// </summary>
        /// <param name="source">The source.</param>
        /// <exception cref="System.ArgumentNullException">source</exception>
        /// <exception cref="System.ArgumentException">Source already added</exception>
        public void AddPluginSource(IPluginSource source)
        {
            if (source == null)
            throw new ArgumentNullException("source");

              if (this.sources.Contains(source))
            throw new ArgumentException(Resources.SourceAlreadyAdded);

              source.PluginAdded += this.OnPluginAdded;
              source.PluginRemoved += this.OnPluginRemoved;

              this.sources.Add(source);

              this.log.Debug(Resources.SourceAdded, source.GetType().FullName);
        }
        /// <summary>
        /// Removes a plugin source from the repository.
        /// </summary>
        /// <param name="source">The source.</param>
        public void RemovePluginSource(IPluginSource source)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }

            if (!this.sources.Contains(source))
            {
                throw new ArgumentException(Resources.UnknownSource);
            }

            this.sources.Remove(source);
            source.PluginAdded   -= this.OnPluginAdded;
            source.PluginRemoved -= this.OnPluginRemoved;

            this.log.Debug(Resources.SourceRemoved, source.GetType().FullName);
        }
        /// <summary>
        /// Adds a plugin source to the repository.
        /// </summary>
        /// <param name="source">The source.</param>
        /// <exception cref="System.ArgumentNullException">source</exception>
        /// <exception cref="System.ArgumentException">Source already added</exception>
        public void AddPluginSource(IPluginSource source)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }

            if (this.sources.Contains(source))
            {
                throw new ArgumentException(Resources.SourceAlreadyAdded);
            }

            source.PluginAdded   += this.OnPluginAdded;
            source.PluginRemoved += this.OnPluginRemoved;

            this.sources.Add(source);

            this.log.Debug(Resources.SourceAdded, source.GetType().FullName);
        }
        /// <summary>
        /// Removes a plugin source from the repository.
        /// </summary>
        /// <param name="source">The source.</param>
        public void RemovePluginSource(IPluginSource source)
        {
            if (source == null)
            throw new ArgumentNullException("source");

              if (!this.sources.Contains(source))
            throw new ArgumentException(Resources.UnknownSource);

              this.sources.Remove(source);
              source.PluginAdded -= this.OnPluginAdded;
              source.PluginRemoved -= this.OnPluginRemoved;

              this.log.Debug(Resources.SourceRemoved, source.GetType().FullName);
        }