lib/twitter_cldr/js/mustache/implementation/clone/clone.coffee (49 lines of code) (raw):
with_data_isolation = (data) -> (fn) ->
original = TwitterCldr.data
TwitterCldr.data = data
result = fn()
TwitterCldr.data = original
result
get_with_data_isolation = (data) -> (target, property_key, receiver) ->
isolate_data = with_data_isolation(data)
isolate_data(->
result = Reflect.get(target, property_key, receiver)
if typeof result == 'function'
fn = result
result = (args...) -> isolate_data(-> Reflect.apply(fn, target, args))
result
)
proxy_or_primitive = (value, handlers) ->
if value instanceof Object
new Proxy(value, handlers)
else
value
TwitterCldr.clone = (data) ->
if !data
throw new Error('Cannot create a clone with no data')
get = get_with_data_isolation(data)
isolate_data = with_data_isolation(data)
proxy_or_primitive(
root,
get: (target, property_key, receiver) ->
switch property_key
when 'set_data'
return -> throw new Error('Cannot set data on a TwitterCldr clone')
else
isolate_data(
-> proxy_or_primitive(
Reflect.get(target, property_key, receiver), {
get,
apply: (args...) ->
isolate_data(
-> Reflect.apply(args...)
)
construct: (args...) ->
isolate_data(
-> proxy_or_primitive(Reflect.construct(args...), { get })
)
}
)
)
set: () -> throw new Error('Cannot set properties on a TwitterCldr clone')
)