1
- class indirectReference
2
- {
3
-
4
- /*
1
+ /*
5
2
CLASS indirectReference
6
3
author: nnnik
7
4
14
11
newIndirectReference: The indirect reference towards the objects passed to the constructor
15
12
16
13
object: The object you want to refer to indirectly
17
- */
14
+
15
+ modeOrModeStr: Controls how the indirectReference is connected to the object directly
16
+ e.g. with a __Call mode all method calls towards the indirectReference will end up calling the same method with the same parameters in the object
17
+ */
18
+
19
+ class indirectReference
20
+ {
21
+
22
+ static relationStorage := {}
23
+ static performanceStorage := {}
24
+ static accessStorage := {}
25
+ static modeStorage := {}
26
+ static baseModes := { __Call:indirectReference.Call, __Set:indirectReference.Set, __Get:indirectReference.Get, __New:indirectReference.New, __Delete:indirectReference.Delete , _NewEnum:"" }
18
27
19
- __New( Object, modes = "" )
28
+ __New( obj, modeOrModeStr : = " __Call " )
20
29
{
21
- if ! ( modes )
30
+ if ! isObject ( obj )
31
+ return
32
+ if isObject ( modeOrModeStr )
22
33
{
23
- if ! indirectReference.storage.hasKey ( & Object )
34
+ str := ""
35
+ For modeName, val in modeOrModeStr
36
+ str .= modeName . " |"
37
+ modeOrModeStr := subStr ( str, 1 , - 1 )
38
+ }
39
+ if ! indirectReference.performanceStorage.hasKey ( & obj )
40
+ {
41
+ indirectReference.performanceStorage[ & obj ] := []
42
+ indirectReference.accessStorage[ & obj ] := []
43
+ obj.base := { __Delete: indirectReference.DeleteObject, base: obj.base }
44
+ }
45
+ if ( ! indirectReference.performanceStorage[ & obj ].hasKey ( modeOrModeStr ) | deleteMode := inStr ( modeOrModeStr, " __Delete" ) )
46
+ {
47
+ if ! indirectReference.modeStorage.hasKey ( modeOrModeStr )
24
48
{
25
- This.base := { __Call:indirectReference.connectBase.__Call, __Delete:indirectReference.removeFromStorage , base:{ __Delete: indirectReference.__Delete } }
26
- indirectReference.storage[ & Object ] := This
27
- indirectReference.storage2[ & This ] := & Object
28
- directReference.enter ( This, Object )
49
+ newMode := {}
50
+ for each, mode in strSplit ( modeOrModeStr, " |" )
51
+ {
52
+ newMode[ mode ] := indirectReference.baseModes[ mode ]
53
+ indirectReference.baseModes[ mode ]
54
+ }
55
+ indirectReference.modeStorage[ modeOrModeStr ] := newMode
29
56
}
30
- return indirectReference.storage[ & Object ]
57
+ newReference := { base: indirectReference.modeStorage[ modeOrModeStr ] }
58
+ indirectReference.accessStorage[ & obj ].Push( & newReference )
59
+ indirectReference.relationStorage[ & newReference ] := & obj
60
+ if ! deleteMode
61
+ indirectReference.performanceStorage[ & obj, modeOrModeStr ] := newReference
62
+ else
63
+ return newReference
31
64
}
32
- for each, value in modes
33
- modes[ each ] := indirectReference.connectBase[ each ]
34
- modes.base := { __Delete:indirectReference.__Delete }
35
- This.base := modes
36
- directReference.enter ( This, Object )
65
+ return indirectReference.performanceStorage[ & obj, modeOrModeStr ]
37
66
}
38
67
39
- static storage := {}
40
- static storage2 := {}
41
- static connectBase := { __Call:indirectReference.Call, __Set:indirectReference.Set, __Get:indirectReference.Get, __New:indirectReference.New, __Delete:indirectReference.Delete , _NewEnum:"" }
68
+ DeleteObject()
69
+ {
70
+ for each, reference in indirectReference.accessStorage[ & This ]
71
+ {
72
+ indirectReference.relationStorage.delete ( reference )
73
+ Object( reference ).base := ""
74
+ }
75
+ indirectReference.accessStorage.Delete ( & This )
76
+ indirectReference.performanceStorage.Delete ( & This )
77
+ if ( isFunc ( This.base.base.__Delete ) && This.base.base.__Delete.name ! = indirectReference.DeleteObject.name )
78
+ {
79
+ This.base := This.base.base
80
+ This.__Delete ()
81
+ }
82
+ }
42
83
43
84
Call( functionName = "" , parameters* )
44
85
{
45
- if ! indirectReference.connectBase .hasKey ( functionName )
86
+ if ! ( indirectReference.baseModes .hasKey ( functionName ) && ! This.base. hasKey ( functionName ) )
46
87
return ( new directReference( This ) )[ functionName ]( parameters* )
47
88
}
48
89
61
102
{
62
103
newIndirectReference := This.base
63
104
This.base := ""
64
- return new ( new directReference( newIndirectReference ) )( parameter* )
105
+ __class := new directReference( newIndirectReference )
106
+ return new __class( parameters* )
65
107
}
66
108
67
109
Delete ()
68
110
{
69
- ret := ( new directReference( This ) ).__Delete ()
70
- continueChain( This, " __Delete" , A_ThisFunc )
71
- return ret
72
- }
73
-
74
- __Delete()
75
- {
76
- This.base := ""
77
- }
78
-
79
- removeFromStorage()
80
- {
81
- pObj := indirectReference.storage2[ & This ]
82
- indirectReference.storage2.Delete ( & This )
83
- indirectReference.storage.Delete ( pObj )
84
- continueChain( This, " __Delete" , A_ThisFunc )
111
+ return ( new directReference( This ) ).__Delete ()
85
112
}
86
113
87
114
}
88
115
89
- class directReference
90
- {
91
-
92
-
93
- /*
94
- CLASS directReference
95
- description: creates direct References from indirect ones.
96
-
97
- usage: object := new directReference( newIndirectReference )
98
-
99
- object: The inderect Reference you want to resolve
100
- */
101
-
102
- static storage := {}
103
- static storage2 := {}
116
+ /*
117
+ CLASS directReference
118
+ description: creates direct References from indirect ones.
104
119
105
- __New( newIndirectReference )
106
- {
107
- if directReference.storage.hasKey ( & newIndirectReference )
108
- return Object( directReference.storage[ & newIndirectReference ] )
109
- indirectReference.saveRemoveFromStorage.Call( newIndirectReference )
110
- }
120
+ usage: object := new directReference( newIndirectReference )
111
121
112
- enter ( newIndirectReference, Object )
113
- {
114
- if ! This.storage.hasKey ( & newIndirectReference )
115
- newIndirectReference.base := { __Delete:This.leaveIndirectReference, base:newIndirectReference.base }
116
- if ! This.storage2.hasKey ( & Object )
117
- Object.base := { __Delete:This.leaveObject, base:Object.base }
118
- This.storage[ & newIndirectReference ] := & Object
119
- This.storage2[ & Object, & newIndirectReference ] := & newIndirectReference
120
- }
122
+ newIndirectReference: A indirectReference created by calling new indirectReference( object )
121
123
122
- leaveObject()
123
- {
124
- ret := continueChain( This, " __Delete" , A_ThisFunc )
125
- storage := directReference.storage2[ & This ]
126
- loop
127
- {
128
- each := ""
129
- for each,val in storage
130
- {
131
- Object( val ).__Delete ()
132
- if storage.hasKey ( each )
133
- storage.Delete ( each )
134
- }
135
- }Until ! each
136
- return ret
137
- }
138
-
139
- leaveIndirectReference()
140
- {
141
- ret := continueChain( This, " __Delete" , A_ThisFunc )
142
- pObj := directReference.storage[ & This ]
143
- directReference.storage.Delete ( & This )
144
- directReference.storage2[ pObj ].Delete ( & This )
145
- if ! directReference.storage2[ pObj ]._newEnum()._Next( each, val )
146
- directReference.storage2.Delete ( pObj )
147
- return ret
148
- }
149
-
150
- }
124
+ object: The object that is refered to by the indirectReference
125
+ */
151
126
152
- continueChain( object, methodName, functionName, parameters * )
127
+ class directReference
153
128
{
154
- obj := object
155
- While ( isObject ( obj ) && ! ( obj.hasKey ( methodName ) && obj[ methodName ].name = functionName ) )
156
- obj := obj.base
157
- obj := obj.base
158
- While ( isObject ( obj ) && ! ( obj.hasKey ( methodName ) && isFunc ( obj[ methodName ] ) ) )
159
- obj := obj.base
160
- if isFunc ( obj[ methodName ] )
161
- return obj[ methodName ].Call( object, parameters* )
129
+ __New( reference )
130
+ {
131
+ return Object( indirectReference.relationStorage[ & reference ] )
132
+ }
162
133
}
0 commit comments