docs: def getTypeFunc(self, data):
          """
          Returns a callable that will encode C{data} to C{self.stream}. If
          C{data} is unencodable, then C{None} is returned.
          """
          if data is None:
              return self.writeNull
  
          t = type(data)
  
          # try types that we know will work
          if t is str or issubclass(t, str):
              return self.writeBytes
          if t is unicode or issubclass(t, unicode):
              return self.writeString
          elif t is bool:
              return self.writeBoolean
          elif t is float:
              return self.writeNumber
          elif t in python.int_types:
              return self.writeNumber
          elif t in (list, tuple):
              return self.writeList
          elif isinstance(data, (list, tuple)):
              return self.writeSequence
          elif t is types.GeneratorType:
              return self.writeGenerator
          elif t is pyamf.UndefinedType:
              return self.writeUndefined
          elif t in (datetime.date, datetime.datetime, datetime.time):
              return self.writeDate
          elif xml.is_xml(data):
              return self.writeXML
  
          # check for any overridden types
          for type_, func in pyamf.TYPE_MAP.iteritems():
              try:
                  if isinstance(data, type_):
                      return _CustomTypeFunc(self, func)
              except TypeError:
                  if python.callable(type_) and type_(data):
                      return _CustomTypeFunc(self, func)
  
          # now try some types that won't encode
          if t in python.class_types:
              # can't encode classes
              return None
          elif isinstance(data, python.func_types):
              # can't encode code objects
              return None
          elif isinstance(t, types.ModuleType):
              # cannot encode module objects
              return None
  
          # well, we tried ..
          return self.writeObject