# (C) Rob W.W. Hooft, 2002. Use freely.

class enumitem:
    def __init__(self,**kw):
        for k,v in kw.items():
            setattr(self,k,v)
            
class smartenum:
    def __init__(self,key,**kw):
        if kw.has_key('num'):
            raise ValueError('You cannot make a %s with a "num" argument'
                             %self.__class__.__name__)
        for k,v in kw.items():
            if len(v)!=len(key):
                raise ValueError('%s does not have the right length '
                                 '(%d instead of %d)'%(k,len(v),len(key)))
        self._items={}
        for i in range(len(key)):
            eikw={'num':i}
            for k,v in kw.items():
                eikw[k]=v[i]
            self._items[key[i]]=enumitem(**eikw)
           
    def __getattr__(self,key):
        return self._items[key]

if __name__=="__main__":        
    categories=smartenum(
        key=['CAT_SETUP','CAT_EVALUATE','CAT_COLLECT_DATA','CAT_INTEGRATE',
              'CAT_SCALE','CAT_EXAMINE_DATA','CAT_SOLVE_STRUCTURE',
              'CAT_REFINE_STRUCTURE','CAT_REPORT','CAT_INSTRUMENT'],
        label=['Setup','Evaluate Crystal','Collect',
                'Integrate','Scale','Examine Data','Solve Structure',
                'Refine Structure','Report','Instrument'],
        s='abcdefghij')
    print categories.CAT_SETUP.num # 'num' is always the sequence # in the enum
    print categories.CAT_SETUP.label
    print categories.CAT_SETUP.s
