diff 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
line wrap: on
line diff
--- a/pydershell/pydershell.py	Mon Sep 07 17:20:24 2009 -0700
+++ b/pydershell/pydershell.py	Mon Sep 07 22:17:57 2009 -0700
@@ -336,6 +336,32 @@
         pyproto = type(value)
         if pyproto not in self.__type_protos:
             jsproto = self.cx.new_object()
+            if hasattr(pyproto, '__jsprops__'):
+                define_getter = self.cx.get_property(jsproto,
+                                                     '__defineGetter__')
+                define_setter = self.cx.get_property(jsproto,
+                                                     '__defineSetter__')
+                for name in pyproto.__jsprops__:
+                    prop = getattr(pyproto, name)
+                    if not type(prop) == property:
+                        raise TypeError("Expected attribute '%s' to "
+                                        "be a property" % name)
+                    getter = None
+                    setter = None
+                    if prop.fget:
+                        getter = self.__wrap_pycallable(prop.fget,
+                                                        pyproto)
+                    if prop.fset:
+                        setter = self.__wrap_pycallable(prop.fset,
+                                                        pyproto)
+                    if getter:
+                        self.cx.call_function(jsproto,
+                                              define_getter,
+                                              (name, getter))
+                    if setter:
+                        self.cx.call_function(jsproto,
+                                              define_setter,
+                                              (name, setter,))
             for name in dir(pyproto):
                 attr = getattr(pyproto, name)
                 if (isinstance(attr, types.UnboundMethodType) and