diff --git a/charms/reactive/bus.py b/charms/reactive/bus.py
index 9676244..885e498 100644
--- a/charms/reactive/bus.py
+++ b/charms/reactive/bus.py
@@ -267,7 +267,10 @@ class Handler(object):
         """
         Lazily evaluate the args.
         """
-        return list(chain.from_iterable(self._args))
+        if not hasattr(self, '_args_evaled'):
+            # cache the args in case handler is re-invoked due to states change
+            self._args_evaled = list(chain.from_iterable(self._args))
+        return self._args_evaled
 
     def invoke(self):
         """

Handler args are dropped if called more than once per hook
Because the args are implemented as generators, any time the list is evaluated after the first it ends up being empty, leading to an "missing arg" error:

```
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined Traceback (most recent call last):
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined   File "/var/lib/juju/agents/unit-nn-0/charm/hooks/namenode-cluster-relation-joined", line 19, in <module>
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined     main()
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined   File "/usr/local/lib/python3.4/dist-packages/charms/reactive/__init__.py", line 73, in main
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined     bus.dispatch()
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined   File "/usr/local/lib/python3.4/dist-packages/charms/reactive/bus.py", line 418, in dispatch
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined     _invoke(other_handlers)
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined   File "/usr/local/lib/python3.4/dist-packages/charms/reactive/bus.py", line 401, in _invoke
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined     handler.invoke()
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined   File "/usr/local/lib/python3.4/dist-packages/charms/reactive/bus.py", line 277, in invoke
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined     self._action(*args)
2016-04-12 15:15:51 INFO namenode-cluster-relation-joined TypeError: report_status() missing 1 required positional argument: 'datanode'
```
diff --git a/tests/test_decorators.py b/tests/test_decorators.py
index 836753a..fdbb512 100644
--- a/tests/test_decorators.py
+++ b/tests/test_decorators.py
@@ -103,6 +103,11 @@ class TestReactiveDecorators(unittest.TestCase):
         action.assert_called_once_with('rel')
         self.assertEqual(reactive.bus.Handler._CONSUMED_STATES, set(['foo', 'bar', 'qux']))
 
+        action.reset_mock()
+        assert handler.test()
+        handler.invoke()
+        action.assert_called_once_with('rel')
+
     @mock.patch.object(reactive.decorators, 'when_all')
     def test_when(self, when_all):
         @reactive.when('foo', 'bar', 'qux')

pip install -e .
parse_log_pytest
requirements.txt
coverage mock nose flake8 ipython ipdb pytest
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
backcall==0.2.0
certifi==2021.5.30
charmhelpers==1.2.1
-e git+https://github.com/juju-solutions/charms.reactive.git@3540030b9b142787f3f7fd16a14ed33d18b4d7a1#egg=charms.reactive
coverage==6.2
decorator==5.1.1
flake8==5.0.4
importlib-metadata==4.2.0
importlib-resources==5.4.0
iniconfig==1.1.1
ipdb==0.13.13
ipython==7.16.3
ipython-genutils==0.2.0
jedi==0.17.2
Jinja2==3.0.3
MarkupSafe==2.0.1
mccabe==0.7.0
mock==5.2.0
netaddr==0.10.1
nose==1.3.7
packaging==21.3
parso==0.7.1
pbr==6.1.1
pexpect==4.9.0
pickleshare==0.7.5
pluggy==1.0.0
prompt-toolkit==3.0.36
ptyprocess==0.7.0
py==1.11.0
pyaml==23.5.8
pycodestyle==2.9.1
pyflakes==2.5.0
Pygments==2.14.0
pyparsing==3.1.4
pytest==7.0.1
PyYAML==6.0.1
six==1.17.0
tomli==1.2.3
traitlets==4.3.3
typing_extensions==4.1.1
wcwidth==0.2.13
zipp==3.6.0

name: charms.reactive
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - backcall==0.2.0
      - charmhelpers==1.2.1
      - coverage==6.2
      - decorator==5.1.1
      - flake8==5.0.4
      - importlib-metadata==4.2.0
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - ipdb==0.13.13
      - ipython==7.16.3
      - ipython-genutils==0.2.0
      - jedi==0.17.2
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - mccabe==0.7.0
      - mock==5.2.0
      - netaddr==0.10.1
      - nose==1.3.7
      - packaging==21.3
      - parso==0.7.1
      - pbr==6.1.1
      - pexpect==4.9.0
      - pickleshare==0.7.5
      - pluggy==1.0.0
      - prompt-toolkit==3.0.36
      - ptyprocess==0.7.0
      - py==1.11.0
      - pyaml==23.5.8
      - pycodestyle==2.9.1
      - pyflakes==2.5.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pyyaml==6.0.1
      - six==1.17.0
      - tomli==1.2.3
      - traitlets==4.3.3
      - typing-extensions==4.1.1
      - wcwidth==0.2.13
      - zipp==3.6.0
prefix: /opt/conda/envs/charms.reactive

tests/test_decorators.py::TestReactiveDecorators::test_when_all
tests/test_decorators.py::TestReactiveDecorators::test_multi tests/test_decorators.py::TestReactiveDecorators::test_not_unless tests/test_decorators.py::TestReactiveDecorators::test_only_once tests/test_decorators.py::TestReactiveDecorators::test_when tests/test_decorators.py::TestReactiveDecorators::test_when_any tests/test_decorators.py::TestReactiveDecorators::test_when_file_changed tests/test_decorators.py::TestReactiveDecorators::test_when_none tests/test_decorators.py::TestReactiveDecorators::test_when_not tests/test_decorators.py::TestReactiveDecorators::test_when_not_all
charms/reactive/bus.py
charms/reactive/bus.py