class_docstr: BaseTransform subclass that performs a sequence of transformations in
  order. Internally, this class uses shaders.FunctionChain to generate
  its glsl_map and glsl_imap functions.
  
  Parameters
  ----------
  transforms : list of BaseTransform instances
      See ``transforms`` property.
class_docstr_tok: ["BaseTransform","subclass","that","performs","a","sequence","of","transformations","in","order",".","Internally",",","this","class","uses","shaders.FunctionChain","to","generate","its","glsl_map","and","glsl_imap","functions",".","Parameters","--","--","--","--","--","transforms",":","list","of","BaseTransform","instances","See","``","transforms","``","property","."]
code: def transforms(self, tr):
      if isinstance(tr, BaseTransform):
          tr = [tr]
      if not isinstance(tr, list):
          raise TypeError("Transform chain must be a list")
  
      # Avoid extra effort if we already have the correct chain
      if len(tr) == len(self._transforms):
          changed = False
          for i in range(len(tr)):
              if tr[i] is not self._transforms[i]:
                  changed = True
                  break
          if not changed:
              return
  
      for t in self._transforms:
          t.changed.disconnect(self._subtr_changed)
      self._transforms = tr
      for t in self._transforms:
          t.changed.connect(self._subtr_changed)
      self._rebuild_shaders()
      self.update()
  
imports: from __future__ import division
  from ..shaders import FunctionChain
  from .base_transform import BaseTransform
  from .linear import NullTransform
label_desc: Use image node_id 3 for calling the ChainTransform obj's underlying member method code with example usage: obj.transforms(tr) without return types