public varChange this[statPart stat, bool setAll]
 {
     get
     {
         switch (stat)
         {
             case statPart.CURRENT: return currentChange;
             case statPart.MAX: return maxChange;
             case statPart.REGEN: return regenChange;
             default: return null;
         }
     }
     set
     {
         switch (stat)
         {
             case statPart.CURRENT:
                 if (setAll)
                 {
                     currentChange = value;
                 }
                 else
                 {
                     currentChange += value;
                 }
                 break;
             case statPart.MAX:
                 maxChange = setAll ? value : maxChange + value;
                 break;
             case statPart.REGEN:
                 regenChange = setAll ? value : regenChange + value;
                 break;
         }
     }
 }
 //Indexed Properties
 public float this[statPart stat]
 {
     get
     {
         switch (stat)
         {
             case statPart.CURRENT: return this.currentValue;
             case statPart.MAX: return this.maxValue;
             case statPart.REGEN: return this.regenPerSecond;
             default: return -1;
         }
     }
     set//TODO:add more checks to set
     {
         switch (stat)
         {
             case statPart.CURRENT:
                 if (value > maxValue) value = maxValue;
                 if (currentChange != null) currentChange(value, value - currentValue);
                 currentValue = value;
                 break;
             case statPart.MAX:
                 if (maxChange != null) maxChange(value, value - maxValue);
                 maxValue = value;
                 break;
             case statPart.REGEN:
                 if (regenChange != null) regenChange(value, value - regenPerSecond);
                 regenPerSecond = value;
                 break;
         }
     }
 }