#!/usr/bin/env python2.4

class State(object):
	def __init__(self):
		pass
	
	def method(context, *args):
		raise NameError, "method() not implemented"

class StateA(State):
	def __init__(self):
		super(StateA, self).__init__()

	def __str__(self):
		return "StateA"
	
	def method(self, context, *args):
		print "%s (%s): %s" % (self, context, ",".join(args))

class StateB(State):
	def __init__(self):
		super(StateB, self).__init__()
		
	def __str__(self):
		return "StateB"
	
	def method(self, context, *args):
		print "%s (%s): %s" % (self, context, ",".join(args))

class Context(object):
	def __init__(self, name, state=None):
		self.name = name
		self._state = state
	
	def __str__(self):
		return self.name
	
	def get_state(self):
		return self._state
	
	def set_state(self, state):
		if state:		
			if not isinstance(state, State):
				raise NameError, "the given state isn't a valid State"
				return
			self._state = state
	
	state = property(get_state, set_state)
	
	def method(self, *args):
		self._state.method(self, *args)

def main():
	context = Context('my context')
	
	sa = StateA()
	sb = StateB()
	
	context.state = sa
	context.method('foo', 'bar')
	
	context.state = sb
	context.method('one', 'two')

if __name__ == '__main__' : main()
