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?