/// <summary>
            /// Initializes a new instance of the <see cref="ConditionMap"/> class.
            /// </summary>
            /// <param name="information">The information describing the condition.</param>
            /// <param name="condition">The condition.</param>
            public ConditionMap(ScheduleConditionInformation information, IScheduleCondition condition)
            {
                {
                    Debug.Assert(information != null, "The condition information should not be a null reference.");
                    Debug.Assert(condition != null, "The condition should not be a null reference.");
                }

                m_Info      = information;
                m_Condition = condition;
            }
        /// <summary>
        /// Adds the <see cref="IScheduleCondition"/> object with the dependencies for that condition.
        /// </summary>
        /// <param name="condition">The condition that should be stored.</param>
        /// <param name="name">The name of the condition that is being described by this information object.</param>
        /// <param name="description">The description of the condition that is being described by this information object.</param>
        /// <returns>An object identifying and describing the condition.</returns>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="condition"/> is <see langword="null" />.
        /// </exception>
        public ScheduleConditionInformation Add(
            IScheduleCondition condition,
            string name,
            string description)
        {
            {
                Lokad.Enforce.Argument(() => condition);
            }

            var id   = new ScheduleElementId();
            var info = new ScheduleConditionInformation(id, name, description);

            m_Conditions.Add(id, new ConditionMap(info, condition));

            return(info);
        }
        /// <summary>
        /// Replaces the condition current stored against the given ID with a new one.
        /// </summary>
        /// <param name="conditionToReplace">The ID of the condition that should be replaced.</param>
        /// <param name="newCondition">The new condition.</param>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="conditionToReplace"/> is <see langword="null" />.
        /// </exception>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="newCondition"/> is <see langword="null" />.
        /// </exception>
        /// <exception cref="UnknownScheduleConditionException">
        ///     Thrown if <paramref name="conditionToReplace"/> is not linked to a known condition.
        /// </exception>
        public void Update(
            ScheduleElementId conditionToReplace,
            IScheduleCondition newCondition)
        {
            {
                Lokad.Enforce.Argument(() => conditionToReplace);
                Lokad.Enforce.Argument(() => newCondition);
                Lokad.Enforce.With <UnknownScheduleConditionException>(
                    m_Conditions.ContainsKey(conditionToReplace),
                    Resources.Exceptions_Messages_UnknownScheduleCondition);
            }

            var oldInfo = m_Conditions[conditionToReplace].Information;
            var info    = new ScheduleConditionInformation(
                conditionToReplace,
                oldInfo.Name,
                oldInfo.Description);

            m_Conditions[conditionToReplace] = new ConditionMap(info, newCondition);
        }
            /// <summary>
            /// Initializes a new instance of the <see cref="ConditionMap"/> class.
            /// </summary>
            /// <param name="information">The information describing the condition.</param>
            /// <param name="condition">The condition.</param>
            public ConditionMap(ScheduleConditionInformation information, IScheduleCondition condition)
            {
                {
                    Debug.Assert(information != null, "The condition information should not be a null reference.");
                    Debug.Assert(condition != null, "The condition should not be a null reference.");
                }

                m_Info = information;
                m_Condition = condition;
            }
        /// <summary>
        /// Replaces the condition current stored against the given ID with a new one.
        /// </summary>
        /// <param name="conditionToReplace">The ID of the condition that should be replaced.</param>
        /// <param name="newCondition">The new condition.</param>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="conditionToReplace"/> is <see langword="null" />.
        /// </exception>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="newCondition"/> is <see langword="null" />.
        /// </exception>
        /// <exception cref="UnknownScheduleConditionException">
        ///     Thrown if <paramref name="conditionToReplace"/> is not linked to a known condition.
        /// </exception>
        public void Update(
            ScheduleElementId conditionToReplace,
            IScheduleCondition newCondition)
        {
            {
                Lokad.Enforce.Argument(() => conditionToReplace);
                Lokad.Enforce.Argument(() => newCondition);
                Lokad.Enforce.With<UnknownScheduleConditionException>(
                    m_Conditions.ContainsKey(conditionToReplace),
                    Resources.Exceptions_Messages_UnknownScheduleCondition);
            }

            var oldInfo = m_Conditions[conditionToReplace].Information;
            var info = new ScheduleConditionInformation(
                conditionToReplace,
                oldInfo.Name,
                oldInfo.Description);
            m_Conditions[conditionToReplace] = new ConditionMap(info, newCondition);
        }
        /// <summary>
        /// Adds the <see cref="IScheduleCondition"/> object with the dependencies for that condition.
        /// </summary>
        /// <param name="condition">The condition that should be stored.</param>
        /// <param name="name">The name of the condition that is being described by this information object.</param>
        /// <param name="description">The description of the condition that is being described by this information object.</param>
        /// <returns>An object identifying and describing the condition.</returns>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="condition"/> is <see langword="null" />.
        /// </exception>
        public ScheduleConditionInformation Add(
            IScheduleCondition condition,
            string name,
            string description)
        {
            {
                Lokad.Enforce.Argument(() => condition);
            }

            var id = new ScheduleElementId();
            var info = new ScheduleConditionInformation(id, name, description);
            m_Conditions.Add(id, new ConditionMap(info, condition));

            return info;
        }