Bruce McKenzie email@example.com suggested making the behaviour of receiving messages dependent on system state.
Brook Conner firstname.lastname@example.org showed how to do this in Self using dynamic inheritance.
This is a very good example of how to use dynamic inheritance. This makes it as easy to vary the result of message lookup depending on either global as on the individual object state.
An interesting paper I read which included different actions on message reception depending on whether an object was idle or executing another method ( they have single thread objects ) was:
"An Effiecient Implementation Scheme of Concurrent Object-Oriented Language on Stock Multicomputers" by Yonezawa et al, in Fourth PPOPP, 1993, pages 218-228.
Their compiler simply generates several C++-like VTables and the object switches between them as its state changes. This is another case of trading memory for speed.