/// <summary>
        /// Tries the apply effect.
        /// </summary>
        /// <param name="effect">The effect.</param>
        /// <returns>
        ///   <c>true</c> if the effect was applied successfully; otherwise, <c>false</c>.
        /// </returns>
        /// <exception cref="ArgumentNullException">effect</exception>
        public bool TryApplyEffect(IEffect effect)
        {
            if (effect == null)
            {
                throw new ArgumentNullException(nameof(effect));
            }

            if (!IsAllowedToUse(effect))
            {
                return(false);
            }

            var oldEffect = effects.FirstOrDefault(alreadyEffect => effectsComparer.Equals(alreadyEffect, effect));

            if (oldEffect != null)
            {
                DestroyEffect(oldEffect);
            }

            effect.ApplyTo(unit, DestroyEffect);
            effects.Add(effect);

            return(true);
        }