Having worked through this further, the parameters of my problem have simplified somewhat. The change event is no longer triggered by any repeating attributes, but there are now two non-repeating attributes to watch. Also, I need to run the attributes through an if/then and a switch. Here is my pseudocode (parts that need to be covered by something else are in bold ): on("change:bab change:bab_flurry", function() { getAttrs(["bab", "bab_flurry", "repeating_melee_mwpn_attack_type" ], function(value) { bab = parseInt(value["bab"], 10); bab_flurry = parseInt(value["bab_flurry"], 10); forEach(repeating_melee) if ( (value["repeating_melee_mwpn_attack_type"] != "Primary") && (value["repeating_melee_mwpn_attack_type"] != "Secondary") ) { //RESET FLAGS AND VALUES TO NULL bab_flag = 0; flurry_flag = 0; attacks2_show = 0; attacks3_show = 0; attacks4_show = 0; attacks5_show = 0; strike02 = ""; strike03 = ""; strike04 = ""; strike05 = ""; switch(value.repeating_melee_mwpn_attack_type) { case "BAB": bab_flag = 1; if (bab > 15) { // 4 ATTACKS attacks2_show = 1; attacks3_show = 1; attacks4_show = 1; strike02 = "@{mwpn_strike02_macro}"; strike03 = "@{mwpn_strike03_macro}"; strike04 = "@{mwpn_strike04_macro}"; } else if (bab > 10) { // 3 ATTACKS attacks2_show = 1; attacks3_show = 1; strike02 = "@{mwpn_strike02_macro}"; strike03 = "@{mwpn_strike03_macro}"; } else if (bab > 5) { // 2 ATTACKS attacks2_show = 1; strike02 = "@{mwpn_strike02_macro}"; } break; case "Flurry": flurry_flag = 1; attacks2_show = 1; strike02 = "@{mwpn_strike02_macro}"; if (bab_flurry > 14) { // 5 ATTACKS attacks3_show = 1; attacks4_show = 1; attacks5_show = 1; strike03 = "@{mwpn_strike03_macro}"; strike04 = "@{mwpn_strike04_macro}"; strike05 = "@{mwpn_strike05_macro}"; } else if (bab_flurry > 10) { // 4 ATTACKS attacks3_show = 1; attacks4_show = 1; strike03 = "@{mwpn_strike03_macro}"; strike04 = "@{mwpn_strike04_macro}"; } else if (bab_flurry > 7) { // 3 ATTACKS attacks3_show = 1; strike03 = "@{mwpn_strike03_macro}"; } break; } setAttrs({ "repeating_melee_mwpn_bab_flag": bab_flag, "repeating_melee_mwpn_flurry_flag": flurry_flag, "repeating_melee_mwpn_primary_flag": primary_flag, "repeating_melee_mwpn_secondary_flag": secondary_flag, "repeating_melee_mwpn_attacks2_show": attacks2_show, "repeating_melee_mwpn_attacks3_show": attacks3_show, "repeating_melee_mwpn_attacks4_show": attacks4_show, "repeating_melee_mwpn_attacks5_show": attacks5_show, "repeating_melee_mwpn_strike02": strike02, "repeating_melee_mwpn_strike03": strike03, "repeating_melee_mwpn_strike04": strike04, "repeating_melee_mwpn_strike05": strike05 }); }); //END OF FOREACH }); // END OF IF/THEN }); Any suggestions?