You'd be best off creating separate threads for specific questions. People willing to help out on coding issues dont really care what the game system you're designing is (it might be great! it's just not relevant for the question), all we want to know are some relevant specifics about the problem you want solving. But to this specific question: McKay B. said: In my system, there are cascading effects of stats. For example, XP determines Level, which helps determine Caster Level, which helps determine Spellcraft Check. When the user types a new value into the XP input, it triggers a Sheet Worker Script that updates Level. Now, as far as I've figured out so far, the Sheet Worker Script also has to be a MASSIVE function that manually updates everything else that depends on Level. Is there a way to compartmentalize all the cascading changes, so that I can write much smaller functions?' Ideally, if I could set up a listener that will notice Level being changed by the first Sheet Worker Script, and will call a resultant Sheet Worker Script that can update everything that depends directly on level (like Caster Level). Then have a listener for Caster Level changing that will run a Sheet Worker Script to update Spellcraft Check. So far, my attempts to code this cascading system are not working. I read that chains of asynchronous calls are not desirable as a best practice, but it seems worthwhile to me to make the code much cleaner and easier to read. Generally speaking, it is by far more efficient to do a massive sheet worker that updates everything relevant for a stat. But also this does eventually lead to putting everything in a single sheet worker, which can be tricky to code. Having separate sheet workers to handle different elements, is much easier to code, but if your sheet gets really big, it can cause lag. So there's always a trade off. If you think things through carefully, you can make the cascade method work pretty well for most sheets. But you do need to think about how you can keep the number of cascades down: minimise the total number of getAttrs and setAttrs calls (as they are the things which slow things down) as much as you can. It's a lot more efficient to do one getAttrs call that reads a hundred attributes and does all the necessary math for them, then it is to have 100 separate getAttrs calls.