/// <summary>
        ///   Updates all effects added to this target.
        /// </summary>
        public virtual void UpdateEffects()
        {
            lock (Effects)
            {
                for (var i = EffectTimes.Count - 1; i >= 0; i--)
                {
                    var effectTime   = EffectTimes[i];
                    var currentTicks = DateTime.Now.Ticks;

                    float deltaTime;
                    if (effectTime.TicksAtLastUpdate < 0)
                    {
                        effectTime.TicksAtLastUpdate = currentTicks;
                        deltaTime = 0f;
                    }
                    else
                    {
                        deltaTime = (currentTicks - effectTime.TicksAtLastUpdate) / 10000000f;
                    }

                    effectTime.TicksAtLastUpdate = currentTicks;
                    effectTime.Effect.Update(deltaTime);

                    if (effectTime.Effect.IsDone)
                    {
                        EffectTimes.RemoveAt(i);
                    }
                }
            }
        }
        /// <summary>
        ///   Removes an effect
        /// </summary>
        /// <param name="effect">The effect to remove.</param>
        public virtual void RemoveEffect(IEffect <T> effect)
        {
            var effectTimeToRemove = EffectTimes.FirstOrDefault(x => x.Effect == effect);

            if (effectTimeToRemove == null)
            {
                return;
            }

            effect.OnDetach(EffectTarget);
            EffectTimes.Remove(effectTimeToRemove);
        }
        /// <summary>
        /// Adds an affect.
        /// </summary>
        /// <param name="effect">The effect to add.</param>
        public virtual void AddEffect(IEffect <T> effect)
        {
            if (EffectTimes.Any(x => x.Effect == effect))
            {
                return;
            }

            if (!effect.CanBeAppliedTo(EffectTarget))
            {
                throw new WrapperException($"Failed to add effect.\r\nThe effect of type '{effect.GetType()}' can't be applied to the target of type '{EffectTarget.GetType()}'.");
            }

            effect.OnAttach(EffectTarget);
            EffectTimes.Add(new EffectTimeContainer(effect, -1));
        }