solaris-js
Version:
A reusable component for interactive visualization of the Solar System
38 lines (30 loc) • 1.35 kB
text/coffeescript
# Selectively expose class members through an auto-generated wrapper.
export default publicize = (PrivateClass, params) ->
PrivateClass.privateInstances = new WeakMap
PrivateClass.publicInstances = new WeakMap
class PublicClass
constructor: (args...) ->
privateInstance = new PrivateClass(args...)
PrivateClass.publicInstances.set(privateInstance, this)
PrivateClass.privateInstances.set(this, privateInstance)
if params?.properties?
for property in params.properties
do (property) ->
Object.defineProperty PublicClass.prototype, property,
get: -> PrivateClass.privateInstances.get(this)[property]
set: (v) -> PrivateClass.privateInstances.get(this)[property] = v
if params?.methods?
for method in params.methods
do (method) ->
PublicClass::[method] = (args...) ->
PrivateClass.privateInstances.get(this)[method](args...)
if params?.static?.methods?
for method in params.static.methods
do (method) ->
PublicClass[method] = (args...) ->
PrivateClass[method](args...)
if params?.expose or publicize.expose or process?.env.PUBLICIZER_EXPOSE
PublicClass.PrivateClass = PrivateClass
Object.defineProperty PublicClass.prototype, 'privateInstance',
get: -> PrivateClass.privateInstances.get(this)
PublicClass