comparison pydershell/pydershell.py @ 26:b7037cd0f375

Added support for exposing object properties to JS.
author Atul Varma <varmaa@toolness.com>
date Mon, 07 Sep 2009 22:17:57 -0700
parents dace90a7f5e3
children 7f12db104246
comparison
equal deleted inserted replaced
25:64fb84017d87 26:b7037cd0f375
334 334
335 def __wrap_pyinstance(self, value): 335 def __wrap_pyinstance(self, value):
336 pyproto = type(value) 336 pyproto = type(value)
337 if pyproto not in self.__type_protos: 337 if pyproto not in self.__type_protos:
338 jsproto = self.cx.new_object() 338 jsproto = self.cx.new_object()
339 if hasattr(pyproto, '__jsprops__'):
340 define_getter = self.cx.get_property(jsproto,
341 '__defineGetter__')
342 define_setter = self.cx.get_property(jsproto,
343 '__defineSetter__')
344 for name in pyproto.__jsprops__:
345 prop = getattr(pyproto, name)
346 if not type(prop) == property:
347 raise TypeError("Expected attribute '%s' to "
348 "be a property" % name)
349 getter = None
350 setter = None
351 if prop.fget:
352 getter = self.__wrap_pycallable(prop.fget,
353 pyproto)
354 if prop.fset:
355 setter = self.__wrap_pycallable(prop.fset,
356 pyproto)
357 if getter:
358 self.cx.call_function(jsproto,
359 define_getter,
360 (name, getter))
361 if setter:
362 self.cx.call_function(jsproto,
363 define_setter,
364 (name, setter,))
339 for name in dir(pyproto): 365 for name in dir(pyproto):
340 attr = getattr(pyproto, name) 366 attr = getattr(pyproto, name)
341 if (isinstance(attr, types.UnboundMethodType) and 367 if (isinstance(attr, types.UnboundMethodType) and
342 hasattr(attr, '__jsexposed__') and 368 hasattr(attr, '__jsexposed__') and
343 attr.__jsexposed__): 369 attr.__jsexposed__):