/// <summary>
        /// Create a new <see cref="DiceDamageEffect"/>.
        /// </summary>
        /// <param name="target">
        /// The <see cref="Target"/> this effect component acts on. This
        /// cannot be null.
        /// </param>
        /// <param name="characterScoreValue">
        /// A score that, when calculated, gives the number of hit points gained.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// No argument can be null.
        /// </exception>
        public HealHitPointsEffect(Target target, ICharacterScoreValue characterScoreValue)
            : base(target)
        {
            if (characterScoreValue == null)
            {
                throw new ArgumentNullException("characterScoreValue");
            }

            this.TemporaryHitPoints = characterScoreValue;
        }
        /// <summary>
        /// Create a new <see cref="Times"/>.
        /// </summary>
        /// <param name="inner">
        /// The score multiplied by <paramref name="multiplicand"/>. This
        /// cannot be null.
        /// </param>
        /// <param name="multiplicand">
        /// The value the score is multiplied by.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="inner"/> cannot be null.
        /// </exception>
        public Times(ICharacterScoreValue inner, int multiplicand)
        {
            if (inner == null)
            {
                throw new ArgumentNullException("inner");
            }

            this.Inner = inner;
            this.Multiplicand = multiplicand;
        }
        /// <summary>
        /// Create a new <see cref="PushEffect"/>.
        /// </summary>
        /// <param name="target">
        /// The <see cref="Target"/> this effect component acts on. This
        /// cannot be null.
        /// </param>
        /// <param name="squares">
        /// An <see cref="ICharacterScoreValue"/> representing the number of squares pushed.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// No argument can be null.
        /// </exception>        
        public PushEffect(Target target, ICharacterScoreValue squares)
            : base(target)
        {
            if (squares == null)
            {
                throw new ArgumentNullException("squares");
            }

            this.Squares = squares;
        }
        /// <summary>
        /// Create a new <see cref="FlyEffect"/>.
        /// </summary>
        /// <param name="target">
        /// The <see cref="Target"/> that can fly.
        /// </param>
        /// <param name="squares">
        /// How far they can fly.
        /// </param>
        /// <param name="actionType">
        /// The action used to fly, usually ActionType.Free.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// No argument can be null.
        /// </exception>
        public FlyEffect(Target target, ICharacterScoreValue squares, ActionType actionType)
            : base(target)
        {
            if (squares == null)
            {
                throw new ArgumentNullException("squares");
            }

            this.Squares = squares;
            this.ActionType = actionType;
        }
        /// <summary>
        /// Create a new <see cref="DiceDamageEffect"/>.
        /// </summary>
        /// <param name="target">
        /// The <see cref="Target"/> this effect component acts on. This
        /// cannot be null.
        /// </param>
        /// <param name="score">
        /// The <see cref="CharacterScore"/> that gains the bonus. This
        /// cannot be null.
        /// </param>
        /// <param name="modifier">
        /// A score that, when calculated, gives the bonus or penalty.
        /// </param>
        /// <param name="until">
        /// When the bonus ends.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// No argument can be null.
        /// </exception>
        public GainModifierEffect(Target target, CharacterScore score, ICharacterScoreValue modifier, Until until)
            : base(target)
        {
            if (score == null)
            {
                throw new ArgumentNullException("score");
            }
            if (modifier == null)
            {
                throw new ArgumentNullException("modifier");
            }

            this.Scores = new List<CharacterScore>(new [] { score });
            this.Modifier = modifier;
            this.Until = until;
        }
        /// <summary>
        /// Create a new <see cref="DiceDamageEffect"/>.
        /// </summary>
        /// <param name="target">
        /// The <see cref="Target"/> this effect component acts on. This
        /// cannot be null.
        /// </param>
        /// <param name="scores">
        /// The <see cref="CharacterScore"/>s that gain the bonus. This 
        /// cannot be null or contain null.
        /// </param>
        /// <param name="modifier">
        /// A score that, when calculated, gives the bonus or penalty.
        /// </param>
        /// <param name="until">
        /// When the bonus ends.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// No argument can be null.
        /// </exception>
        public GainModifierEffect(Target target, IEnumerable<CharacterScore> scores, ICharacterScoreValue modifier, Until until)
            : base(target)
        {
            if (scores == null)
            {
                throw new ArgumentNullException("scores");
            }
            if (scores.Any(x => x == null))
            {
                throw new ArgumentNullException("scores");
            }
            if (modifier == null)
            {
                throw new ArgumentNullException("modifier");
            }

            this.Scores = new List<CharacterScore>(scores);
            this.Modifier = modifier;
            this.Until = until;
        }