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 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) if isinstance(data, (list, tuple)): return self.writeSequence # 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