-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.coffee
81 lines (78 loc) · 1.92 KB
/
index.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
hasProto = !!{}.__proto__
hasSetProto = !!Object.setPrototypeOf
class Args
getKey = (arg)->
if typeof arg == 'string'
arg
else
arg.key
getValue = (arg, kiduc)->
if typeof arg != 'string'
switch arg.type
when 'static' then arg.value
when 'dynamic' then kiduc.run.apply(kiduc, arg.value)
constructor: (args, kiduc)->
@kiduc = kiduc
@keys = () ->
getKey(arg) for arg in args
@values = () ->
getValue(arg, kiduc) for arg in args
@mixin = (options) ->
data = for key, i in @keys()
if options[key]
options[key].key = key
options[key]
else
args[i]
new Args(data, kiduc)
class Kiduc
$scope = Symbol('scope')
constructor:(scope) ->
@[$scope] = {}
@scope = scope;
return
add: (name, args) ->
[args..., content] = args;
args = new Args(args, this)
@[$scope][name] = {
args: args,
content: content,
handler: new Function(args.keys()..., content)
};
run: (name, scope, options) ->
item = @[$scope][name]
if (item)
globalScope = @scope;
args = item.args.mixin(options).values();
item.handler.apply({
scope: scope,
global: globalScope
}, args);
defaults: (name) ->
{args} = @[$scope][name]
args.values();
reset: (scope)->
@[$scope] = {}
@scope = scope || @scope
clone: (deep)->
scope = @scope
handles = @[$scope]
if (deep)
next = new Kiduc({scope...})
next[$scope] = {handles...}
else
next = new Kiduc(scope)
next[$scope] = handles
next
next: (scope = {})->
next = new Kiduc(scope)
if hasProto
next.scope.__proto__ = @scope
next[$scope].__proto__ = @[$scope]
else if hasSetProto
Object.setPrototypeOf(next.scope, @scope)
Object.setPrototypeOf(next[$scope], [$scope])
else
next = @clone()
next
module.exports = Kiduc;