#!/usr/local/bin/python import sys from textpak2 import pack, unpack # reuse textpak2 stuff mymenu = { 'pack': pack, # interactive menu 'unpack': unpack, # not static class data 'stop': sys.exit} def Menu(menu): # a 'superclass' obj = {} # an 'instance' def run(prompt='?', self=obj): # a 'method' try: # saves this call's "obj" while 1: print '\n\tMENU...' self['showOptions']() # call 'subclass' method command = raw_input(prompt) try: flag = self['runCommand'](command) except (IndexError, KeyError): print "what: '%s'?" % command else: if flag: break except EOFError: pass obj['menu'] = menu # assign 'data-member' obj['run'] = run # assign 'methods' return obj def DictMenu(menu): # 'subclass' constructor obj = Menu(menu) # call constructor def showOptions(self=obj): # subclass methods options = self['menu'].keys() # nested functions options.sort() for cmd in options: print '\t\t' + cmd def runCommand(cmd, self=obj): return self['menu'][cmd]() obj['showOptions'] = showOptions # assign methods obj['runCommand'] = runCommand # can over-ride Menu keys return obj if __name__ == '__main__': DictMenu(mymenu)['run']('>')