docs: def call(sender, topic, *args, **kwargs):
      """
      Invoke receiver functions according topic, it'll invoke receiver functions one by one,
      and it'll not return anything, so if you want to return a value, you should
      use get function.
      """
      if not topic in _receivers:
          return
      items = _receivers[topic]
      def _cmp(x, y):
          return cmp(x[0], y[0])
      
      items.sort(_cmp)
      i = 0
      while i<len(items):
          nice, f = items[i]
          i = i + 1
          _f = f['func']
          if not _f:
              try:
                  _f = import_attr(f['func_name'])
              except (ImportError, AttributeError) as e:
                  logging.error("Can't import function %s" % f['func_name'])
                  raise
              f['func'] = _f
          if callable(_f):
              kw = kwargs.copy()
              if not _test(kw, f):
                  continue
              try:
                  _f(sender, *args, **kw)
              except:
                  func = _f.__module__ + '.' + _f.__name__
                  logging.exception('Calling dispatch point [%s] %s(%r, %r) error!' % (topic, func, args, kw))
                  raise
          else:
              raise Exception, "Dispatch point [%s] %r can't been invoked" % (topic, _f)