class_docstr: Emulates the API of a MainFunction while wrapping all vertex or fragment
  shaders in a MultiProgram.
  
  Example::
  
      mp = MultiProgram(vert, frag)
      mp.add_program('p1')
      mp.add_program('p2')
  
      # applies to all programs
      mp.vert['u_scale'] = (1, 2)
  
      # applies to one program
      mp.get_program('p1').frag['u_color'] = (1, 1, 1, 1)  
docstr: New program was added to the multiprogram; update items in the shader.
docstr_tok: ["New","program","was","added","to","the","multiprogram",";","update","items","in","the","shader","."]
code: def _new_program(self, p):
      """New program was added to the multiprogram; update items in the shader."""
      for k, v in self._set_items.items():
          getattr(p, self._shader)[k] = v
  
imports: import weakref
  from .program import ModularProgram
label_desc: Use image node_id 4 for calling the MultiShader obj's underlying member method code with example usage: obj._new_program(p) without return types