It uses RegisterForMenu on the StatsMenu with GetPerkPoints to determine when the player has added new perks. whenever it detects that perks have been added (if there are fewer perk points on menu close than on menu open), the script will refresh its perk data.
My next question: Is there a technical limitation or an other issues with large numbers of properties on one script. I will likely need at least a property for every perk I would like to support caching for, and then additional booleans for caching actual perk status. If this would result in too many variables, I can use arrays of booleans and assign each perk an arbitrary number/array index.