class_docstr: A Link defines some connection between a source and target object
  in their visualization. It is quite similar to a Stream as it
  allows defining callbacks in response to some change or event on
  the source object, however, unlike a Stream, it does not transfer
  data and make it available to user defined subscribers. Instead
  a Link directly causes some action to occur on the target, for JS
  based backends this usually means that a corresponding JS callback
  will effect some change on the target in response to a change on
  the source.
  
  A Link must define a source object which is what triggers events,
  but must not define a target. It is also possible to define bi-
  directional links between the source and target object.
docstr: Registers the Link
docstr_tok: ["Registers","the","Link"]
code: def link(self):
      """
      Registers the Link
      """
      if self.source in self.registry:
          links = self.registry[self.source]
          params = {
              k: v
              for k, v in self.param.values().items()
              if k != "name"
          }
          for link in links:
              link_params = {
                  k: v
                  for k, v in link.param.values().items()
                  if k != "name"
              }
              if (
                  type(link) is type(self)
                  and link.source is self.source
                  and link.target is self.target
                  and params == link_params
              ):
                  return
          self.registry[self.source].append(self)
      else:
          self.registry[self.source] = [self]
  
imports: import weakref
  from collections import defaultdict
  import param
  from ..core.util import dimension_sanitizer
label_desc: Use image node_id 5 for calling the Link obj's underlying member method code with example usage: obj.link() without return types