Class: ReactiveManager
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#add_parent!(parent) ⇒ Object
-
#check_tag(method_name, tag_name, current_obj) ⇒ Object
Method calls can be tagged so the reactive value knows how to handle them.
-
#cur(shallow = false, ignore_cache = false) ⇒ Object
-
#cur=(val) ⇒ Object
-
#deep_cur ⇒ Object
Returns a copy of the object with where all ReactiveValue’s are replaced with their current value.
-
#event_added(event, scope, first, first_for_event) ⇒ Object
-
#event_removed(event, last, last_for_event) ⇒ Object
-
#initialize(reactive_value, getter, setter = nil, scope = nil) ⇒ ReactiveManager
constructor
When created, ReactiveValue’s get a getter (a proc).
-
#inspect ⇒ Object
-
#reactive? ⇒ Boolean
-
#reactive_object_id ⇒ Object
-
#reactive_value ⇒ Object
-
#remove_followers ⇒ Object
-
#remove_parent!(parent) ⇒ Object
-
#set_scope(new_scope) ⇒ Object
-
#set_scope!(new_scope) ⇒ Object
-
#setter!(setter = nil, &block) ⇒ Object
-
#unwrap_if_pass_reactive(args, method_name, current_obj) ⇒ Object
-
#update_followers ⇒ Object
-
#with(*args, &block) ⇒ Object
With returns a new reactive value dependent on any arguments passed in.
-
#with_and_options(args, &block) ⇒ Object
Methods included from Events
#event_chain, #has_listeners?, #listeners, #on, #remove_listener, #trigger!, #trigger_by_scope!, #trigger_for_methods!
Constructor Details
#initialize(reactive_value, getter, setter = nil, scope = nil) ⇒ ReactiveManager
When created, ReactiveValue’s get a getter (a proc)
195
196
197
198
199
200
201
202
|
# File 'lib/volt/reactive/reactive_value.rb', line 195
def initialize(reactive_value, getter, setter=nil, scope=nil)
@reactive_value = reactive_value
@getter = getter
@setter = setter
@scope = scope
@parents = []
end
|
Instance Attribute Details
Returns the value of attribute parents.
192
193
194
|
# File 'lib/volt/reactive/reactive_value.rb', line 192
def parents
@parents
end
|
Returns the value of attribute scope.
192
193
194
|
# File 'lib/volt/reactive/reactive_value.rb', line 192
def scope
@scope
end
|
Instance Method Details
#add_parent!(parent) ⇒ Object
402
403
404
405
|
# File 'lib/volt/reactive/reactive_value.rb', line 402
def add_parent!(parent)
@parents << parent
event_chain.add_object(parent)
end
|
#check_tag(method_name, tag_name, current_obj) ⇒ Object
Method calls can be tagged so the reactive value knows how to handle them. This lets you check the state of the tags.
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
# File 'lib/volt/reactive/reactive_value.rb', line 329
def check_tag(method_name, tag_name, current_obj)
if current_obj.respond_to?(:reactive_method_tag)
tag = current_obj.reactive_method_tag(method_name, tag_name)
unless tag
tag = current_obj.reactive_method_tag(:__all_methods, tag_name)
end
tag = tag.call(method_name) if tag.class == ::Proc
return tag
end
return nil
end
|
#cur(shallow = false, ignore_cache = false) ⇒ Object
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
|
# File 'lib/volt/reactive/reactive_value.rb', line 237
def cur(shallow=false, ignore_cache=false)
if @cur_cache && !shallow && !ignore_cache
result = @cur_cache
else
if @getter.class == ::Proc
begin
result = @getter.call
rescue => e
result = e
end
else
result = @getter
end
end
if !shallow && result.reactive?
result = result.cur
end
return result
end
|
#cur=(val) ⇒ Object
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
|
# File 'lib/volt/reactive/reactive_value.rb', line 302
def cur=(val)
if @setter
@setter.call(val)
elsif @scope == nil
@getter = val
@setter = nil
trigger!('changed')
else
raise "Value can not be updated"
end
end
|
Returns a copy of the object with where all ReactiveValue’s are replaced with their current value. NOTE: Classes need to implement their own deep_cur method for this to work, it works out of the box with arrays and hashes.
322
323
324
|
# File 'lib/volt/reactive/reactive_value.rb', line 322
def deep_cur
self.cur.deep_cur
end
|
#event_added(event, scope, first, first_for_event) ⇒ Object
221
222
223
224
225
226
|
# File 'lib/volt/reactive/reactive_value.rb', line 221
def event_added(event, scope, first, first_for_event)
update_followers if first
end
|
#event_removed(event, last, last_for_event) ⇒ Object
228
229
230
231
232
233
|
# File 'lib/volt/reactive/reactive_value.rb', line 228
def event_removed(event, last, last_for_event)
remove_followers if last
end
|
212
213
214
|
# File 'lib/volt/reactive/reactive_value.rb', line 212
def inspect
"@<#{self.class.to_s}:#{object_id} #{cur.inspect}>"
end
|
208
209
210
|
# File 'lib/volt/reactive/reactive_value.rb', line 208
def reactive?
true
end
|
#reactive_object_id ⇒ Object
216
217
218
|
# File 'lib/volt/reactive/reactive_value.rb', line 216
def reactive_object_id
@reactive_object_id ||= rand(100000)
end
|
#reactive_value ⇒ Object
204
205
206
|
# File 'lib/volt/reactive/reactive_value.rb', line 204
def reactive_value
@reactive_value
end
|
#remove_followers ⇒ Object
290
291
292
293
294
295
296
297
298
299
300
|
# File 'lib/volt/reactive/reactive_value.rb', line 290
def remove_followers
if @cur_cache
@cur_cache = nil
end
if @cur_cache_chain_listener
@cur_cache_chain_listener.remove
@cur_cache_chain_listener = nil
end
end
|
#remove_parent!(parent) ⇒ Object
407
408
409
410
|
# File 'lib/volt/reactive/reactive_value.rb', line 407
def remove_parent!(parent)
@parents.delete(parent)
event_chain.remove_object(parent)
end
|
#set_scope(new_scope) ⇒ Object
419
420
421
|
# File 'lib/volt/reactive/reactive_value.rb', line 419
def set_scope(new_scope)
dup.scope!(new_scope)
end
|
#set_scope!(new_scope) ⇒ Object
413
414
415
416
417
|
# File 'lib/volt/reactive/reactive_value.rb', line 413
def set_scope!(new_scope)
@scope = new_scope
self
end
|
#setter!(setter = nil, &block) ⇒ Object
424
425
426
|
# File 'lib/volt/reactive/reactive_value.rb', line 424
def setter!(setter=nil, &block)
@setter = setter || block
end
|
#unwrap_if_pass_reactive(args, method_name, current_obj) ⇒ Object
347
348
349
350
351
352
353
|
# File 'lib/volt/reactive/reactive_value.rb', line 347
def unwrap_if_pass_reactive(args, method_name, current_obj)
pass_reactive = check_tag(method_name, :pass_reactive, current_obj)
return pass_reactive ? args : args.map{|v| v.cur }
end
|
#update_followers ⇒ Object
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
|
# File 'lib/volt/reactive/reactive_value.rb', line 266
def update_followers
return if @setting_up
if has_listeners?
current_obj = cur(true, true)
should_attach = current_obj.respond_to?(:on)
if should_attach
if !@cur_cache || current_obj.object_id != @cur_cache.object_id
remove_followers
@setting_up = true
@cur_cache_chain_listener = self.event_chain.add_object(current_obj)
@setting_up = nil
end
else
remove_followers
end
@cur_cache = current_obj
end
end
|
#with(*args, &block) ⇒ Object
With returns a new reactive value dependent on any arguments passed in. If a block is passed in, the getter is the block its self, which will be passed the .cur and the .cur of any reactive arguments.
358
359
360
|
# File 'lib/volt/reactive/reactive_value.rb', line 358
def with(*args, &block)
return with_and_options(args, &block)
end
|
#with_and_options(args, &block) ⇒ Object
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
|
# File 'lib/volt/reactive/reactive_value.rb', line 362
def with_and_options(args, &block)
getter = @getter
setter = @setter
scope = @scope
if block
getter = ::Proc.new do
current_val = self.cur
if current_val.is_a?(Exception)
current_val
else
block.call(current_val, args)
end
end
setter = nil
scope = nil
end
new_val = ReactiveValue.new(getter, setter, scope)
new_val.reactive_manager.add_parent!(self)
args.select(&:reactive?).each do |arg|
new_val.reactive_manager.add_parent!(arg.reactive_manager)
end
return new_val
end
|