/// <summary>
        /// Evaluates rule that can work one way
        /// </summary>
        /// <param name="traits">character traits to modify</param>
        /// <param name="rule">rules to evaluate</param>
        private static void EvaluateSimpleRule(CharacterTraits traits, QualityTraitRule rule)
        {
            var leadingProperty  = traits.GetType().GetProperty(rule.LeadingQuality);
            var attachedProperty = traits.GetType().GetProperty(rule.AttachedQuality);

            if (leadingProperty == null || attachedProperty == null)
            {
                return;
            }

            int leadingValue;
            int attachedValue;

            if (ValuesAreWithinRange(traits, rule, leadingProperty, attachedProperty, out leadingValue, out attachedValue))
            {
                return;
            }

            if (leadingValue > attachedValue)
            {
                //We won't raise if it's a weakness
                if (!traits.WeakPoints.Contains(rule.AttachedQuality))
                {
                    attachedProperty.SetValue(traits, leadingValue - rule.RangeLimit + 1);
                }
            }
            else
            {
                //We won't lower it if it's a strong point
                if (!traits.StrongPoints.Contains(rule.AttachedQuality))
                {
                    attachedProperty.SetValue(traits, leadingValue + rule.RangeLimit - 1);
                }
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="traits"></param>
        /// <param name="rule"></param>
        /// <param name="leadingProperty"></param>
        /// <param name="attachedProperty"></param>
        /// <param name="leadingValue"></param>
        /// <param name="attachedValue"></param>
        /// <returns></returns>
        private static bool ValuesAreWithinRange(CharacterTraits traits, QualityTraitRule rule, PropertyInfo leadingProperty,
                                                 PropertyInfo attachedProperty, out int leadingValue, out int attachedValue)
        {
            leadingValue  = (int)leadingProperty.GetValue(traits);
            attachedValue = (int)attachedProperty.GetValue(traits);

            return(Math.Abs(leadingValue - attachedValue) <= rule.RangeLimit);
        }
        /// <summary>
        /// Evaluates rule that can work both ways
        /// </summary>
        /// <param name="traits">character traits to modify</param>
        /// <param name="rule">rules to evaluate</param>
        private void EvaluateBidirectionalRule(CharacterTraits traits, QualityTraitRule rule)
        {
            var leadingProperty  = traits.GetType().GetProperty(rule.LeadingQuality);
            var attachedProperty = traits.GetType().GetProperty(rule.AttachedQuality);

            if (leadingProperty == null || attachedProperty == null)
            {
                return;
            }

            int leadingValue;
            int attachedValue;

            if (ValuesAreWithinRange(traits, rule, leadingProperty, attachedProperty, out leadingValue, out attachedValue))
            {
                return;
            }

            if (leadingValue > attachedValue)
            {
                //If the attached is a weak point AND the leading is a NOT a strong point,
                //then we just lower the leading property. Otherwise we raise the attached quality.
                if (traits.WeakPoints.Contains(rule.AttachedQuality))
                {
                    if (!traits.StrongPoints.Contains(rule.LeadingQuality))
                    {
                        leadingProperty.SetValue(traits, attachedValue + rule.RangeLimit + 1);
                    }
                }
                else
                {
                    attachedProperty.SetValue(traits, leadingValue - rule.RangeLimit + 1);
                }
            }
            else
            {
                //If the leading value is a weakness AND the attached is not a strong point,
                //we lower the attached property. Otherwise we raise the leading quality
                if (traits.WeakPoints.Contains(rule.LeadingQuality))
                {
                    if (!traits.StrongPoints.Contains(rule.AttachedQuality))
                    {
                        attachedProperty.SetValue(traits, leadingValue + rule.RangeLimit - 1);
                    }
                }
                else
                {
                    leadingProperty.SetValue(traits, attachedValue - rule.RangeLimit + 1);
                }
            }
        }