from RoleUser import RoleUser
from Role import Role
from MiscUtils import NoDefault


class RoleUserManagerMixIn:
    """
    RoleUserManagerMixIn adds the functionality of keeping a dictionary mapping 
    names to role instances. Several accessor methods are provided for this.
    """


    ## Init ##

    def __init__(self):
        self._roles = {}
        self.initUserClass()

    def initUserClass(self):
        """
        Invoked by __init__ to set the default user class to
        RoleUser.
        """
        self.setUserClass(RoleUser)


    ## Roles ##

    def addRole(self, role):
        assert isinstance(role, Role)
        name = role.name()
        assert not self._roles.has_key(name)
        self._roles[name] = role

    def role(self, name, default=NoDefault):
        if default is NoDefault:
            return self._roles[name]
        else:
            return self._roles.get(name, default)

    def hasRole(self, name):
        return self._roles.has_key(name)

    def delRole(self, name):
        del self._roles[name]

    def roles(self):
        return self._roles

    def clearRoles(self):
        self._roles = {}