 
class LookupDictionary(dict):
    """
    a dictionary which can lookup value by key, or keys by value
    """
    def __init__(self, items=[]):
        """items can be a list of pair_lists or a dictionary"""
        dict.__init__(self, items)
 
    def get_keys_for_value(self, value, fail_value = None):
        """find the key(s) as a list given a value"""
        list_result = [item[0] for item in self.items() if item[1] == value]
        if len(list_result) > 0:
            return list_result
        return fail_value
 
    def get_first_key_for_value(self, value, fail_value = None):
        """return the first key of this dictionary given the value"""
        list_result = [item[0] for item in self.items() if item[1] == value]
        if len(list_result) > 0:
            return list_result[0]
        return fail_value

    def get_value(self, key, fail_value = None):
        """find the value given a key"""
        if key in self:
            return self[key]
        return fail_value


class Enum(LookupDictionary):
    
    def __init__(self, initial_value=0, items=[]):
        """items can be a list of pair_lists or a dictionary"""
        LookupDictionary.__init__(self, items)
        self.value = initial_value
    
    def set_value(self, v):
        v_typename = typeof(v).__name__
        if v_typename == 'str':
            if str in self:
                v = self[v]
            else:
                v = 0
        else:
            self.value = v
    
    def get_enum_value(self):
        return self.value
    
    def get_enum_name(self):
        return self.__str__()

    def __str__(self):
        s = self.get_first_key_for_value (self.value, None)
        if s == None:
            s = "%#8.8x" % self.value
        return s
    
    def __repr__(self):
        return self.__str__()