def __init__(self, **kwargs):
     super(CommDispatcherBase, self).__init__(**kwargs)
     self.IO_MODULES = {}
     self.IO_MODULE_UPDN_ORDER = {}
     for key in ['up', 'dn']:
         self.IO_MODULE_UPDN_ORDER[key] = ChildGroup(name=key, child_class=DummyIOObj)
     self.ServiceConnector = ServiceConnector()
class CommDispatcherBase(BaseIO.BaseIO):
    def __init__(self, **kwargs):
        super(CommDispatcherBase, self).__init__(**kwargs)
        self.IO_MODULES = {}
        self.IO_MODULE_UPDN_ORDER = {}
        for key in ['up', 'dn']:
            self.IO_MODULE_UPDN_ORDER[key] = ChildGroup(name=key, child_class=DummyIOObj)
        self.ServiceConnector = ServiceConnector()
    
    @property
    def SystemData(self):
        return self.GLOBAL_CONFIG.get('SystemData')
    
    @property
    def IO_CLASSES(self):
        return IO_CLASSES
        
    def do_connect(self, **kwargs):
        self.ServiceConnector.publish()
        updnobj = self.IO_MODULE_UPDN_ORDER['up'].indexed_items
        for key in sorted(updnobj.keys()):
            obj = updnobj[key].io_obj
            obj.do_connect(**kwargs)
        self.connected = True
        
    def do_disconnect(self, **kwargs):
        updnobj = self.IO_MODULE_UPDN_ORDER['dn'].indexed_items
        for key in reversed(sorted(updnobj.keys())):
            obj = updnobj[key].io_obj
            obj.do_disconnect(**kwargs)
        self.ServiceConnector.unpublish()
        self.connected = False
        
    def shutdown(self):
        updnobj = self.IO_MODULE_UPDN_ORDER['dn'].indexed_items
        for key in reversed(sorted(updnobj.keys())):
            obj = updnobj[key].io_obj
            if hasattr(obj, 'shutdown'):
                obj.shutdown()
            else:
                obj.do_disconnect(blocking=True)
        self.ServiceConnector.unpublish(blocking=True)
        self.connected = False
    
    def build_io_module(self, name, updn_order=False, **kwargs):
        cls = self.IO_CLASSES.get(name)
        if not cls:
            return
        if updn_order is True:
            updn_order = [None, None]
        kwargs.setdefault('comm', self)
        obj = cls(**kwargs)
        self.IO_MODULES[name] = obj
        if type(updn_order) in [list, tuple]:
            for i, key in enumerate(['up', 'dn']):
                index = updn_order[i]
                c_kwargs = dict(id=name, obj=obj)
                if index is not None:
                    c_kwargs['Index'] = index
                dobj = self.IO_MODULE_UPDN_ORDER[key].add_child(**c_kwargs)
        return obj
        
    def remove_io_module(self, name):
        obj = self.IO_MODULES.get(name)
        if not obj:
            return
        if hasattr(obj, 'shutdown'):
            obj.shutdown()
        else:
            obj.do_disconnect(blocking=True)
        obj.unlink()
        del self.IO_MODULES[name]
        return obj