Return object instead of function for remote object type.
authorCheng Zhao <zcbenz@gmail.com>
Thu, 25 Apr 2013 07:28:37 +0000 (15:28 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Thu, 25 Apr 2013 07:28:37 +0000 (15:28 +0800)
renderer/api/lib/remote.coffee

index 2ae0b9a..0c61853 100644 (file)
@@ -6,42 +6,44 @@ generateFromPainObject = (plain) ->
   else if plain.type is 'error'
     throw new Error('Remote Error: ' + plain.value)
 
-  # A shadow class to represent the remote object.
-  class RemoteObject
-    constructor: () ->
-      if @constructor == RemoteObject
-        # Constructor call.
-        obj = ipc.sendChannelSync 'ATOM_INTERNAL_CONSTRUCTOR', plain.id, Array::slice.call(arguments)
+  ret = {}
+  if plain.type is 'function'
+    # A shadow class to represent the remote function object.
+    ret =
+    class RemoteObject
+      constructor: ->
+        if @constructor == RemoteObject
+          # Constructor call.
+          obj = ipc.sendChannelSync 'ATOM_INTERNAL_CONSTRUCTOR', plain.id, Array::slice.call(arguments)
 
-        # Returning object in constructor will replace constructed object
-        # with the returned object.
-        # http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-returning-this
-        return generateFromPainObject obj
-      else
-        # Function call.
-        ret = ipc.sendChannelSync 'ATOM_INTERNAL_FUNCTION_CALL', plain.id, Array::slice.call(arguments)
-        generateFromPainObject ret
+          # Returning object in constructor will replace constructed object
+          # with the returned object.
+          # http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-returning-this
+          return generateFromPainObject obj
+        else
+          # Function call.
+          ret = ipc.sendChannelSync 'ATOM_INTERNAL_FUNCTION_CALL', plain.id, Array::slice.call(arguments)
+          return generateFromPainObject ret
 
-  # Polulate shadow members.
+  # Polulate delegate members.
   for member in plain.members
     do (member) ->
       if member.type is 'function'
-        RemoteObject[member.name] = ->
+        ret[member.name] = ->
           # Call member function.
           ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_CALL', plain.id, member.name, Array::slice.call(arguments)
           generateFromPainObject ret
       else
-        RemoteObject.__defineSetter__ member.name, (value) ->
+        ret.__defineSetter__ member.name, (value) ->
           # Set member data.
           ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_SET', plain.id, member.name, value
-          undefined
 
-        RemoteObject.__defineGetter__ member.name, ->
+        ret.__defineGetter__ member.name, ->
           # Get member data.
           ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_GET', plain.id, member.name
           generateFromPainObject ret
 
-  RemoteObject
+  ret
 
 exports.require = (module) ->
   plain = ipc.sendChannelSync 'ATOM_INTERNAL_REQUIRE', module