Since the params member is part of the calling AA, there's no need to pass any parameters at all:
butts[index].action()
And in the action function:
function action() as void
p1 = m.params.param1
p2 = m.params.param2
etc.
However (you knew there was a however didn't you?), stylistically this isn't the greatest way to do things unless the parameters are fairly static. If you have to modify the params member of the AA just before making every call, it's better to explicitly pass them as parameters rather than doing something like this:
butts[index].params.param1 = something
butts[index].params.param2 = something_else
butts[index].action()
Hiding the fact that you're passing dynamic parameters to the function somewhat obfuscates the logic.
--Mark