from Vault import Vault
from main.Control import Control
from plugin.Interface import Interface


#
# Wrapper for controls.
#
class ControlWrapper(object):

    def __init__(self, control):

        self.__dict__["_ControlWrapper__control"] = Vault(control)
        self.__dict__["_ControlWrapper__properties"] = \
                     Vault( dict(Interface.get_properties(control.__class__)) )

        ids =  [ Interface.get_id(i)
                 for i in Interface.get_interfaces( control.__class__ ) ]
        taz_ids = [ Interface.get_taz_style_id(i)
                    for i in Interface.get_interfaces( control.__class__ ) ]

        self.__dict__["_ControlWrapper__ifaces_id"] = \
                                                  Vault( tuple(ids + taz_ids) )



    def __setattr__(self, name, value):

        try:
            prop = self.__properties(open)[name]
        except KeyError:
            log("Warning: Property \"%s\" isn't available." % (name,))
            return

        prop.fset(self.__control(open), value)



    def __getattr__(self, name):

        if name in Control.AUTHORIZED_METHODS:
            return getattr(self.__control(open), name)

        try:
            prop = self.__properties(open)[name]
        except KeyError:
            log("Warning: Property \"%s\" isn't available." % (name,))
            return Null

        return prop.fget(self.__control(open))



    def get_interfaces_id(self):

        """
        @return : implemented interfaces' id
        @rtype : list of str
        """

        return self.__ifaces_id(open)

