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 ⇒ 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) ⇒ Object
-
#event_removed(event, last) ⇒ Object
-
#initialize(getter, setter = nil, scope = nil) ⇒ ReactiveManager
constructor
When created, ReactiveValue’s get a getter (a proc).
-
#inspect ⇒ Object
-
#object_tracker ⇒ Object
-
#reactive? ⇒ Boolean
-
#reactive_object_id ⇒ 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
-
#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, #listeners, #on, #remove_listener, #trigger!, #trigger_by_scope!, #trigger_for_methods!
Constructor Details
#initialize(getter, setter = nil, scope = nil) ⇒ ReactiveManager
When created, ReactiveValue’s get a getter (a proc)
241
242
243
244
245
246
247
|
# File 'lib/volt/reactive/reactive_value.rb', line 241
def initialize(getter, setter=nil, scope=nil)
@getter = getter
@setter = setter
@scope = scope
@parents = []
end
|
Instance Attribute Details
Returns the value of attribute parents.
238
239
240
|
# File 'lib/volt/reactive/reactive_value.rb', line 238
def parents
@parents
end
|
Returns the value of attribute scope.
238
239
240
|
# File 'lib/volt/reactive/reactive_value.rb', line 238
def scope
@scope
end
|
Instance Method Details
#add_parent!(parent) ⇒ Object
410
411
412
413
|
# File 'lib/volt/reactive/reactive_value.rb', line 410
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.
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
|
# File 'lib/volt/reactive/reactive_value.rb', line 337
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
|
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
|
# File 'lib/volt/reactive/reactive_value.rb', line 280
def cur
if @getter.class == ::Proc
begin
result = @getter.call
rescue => e
result = e
end
else
result = @getter
end
if result.reactive?
result = result.cur
end
return result
end
|
#cur=(val) ⇒ Object
313
314
315
316
317
318
319
320
321
322
323
324
|
# File 'lib/volt/reactive/reactive_value.rb', line 313
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.
330
331
332
|
# File 'lib/volt/reactive/reactive_value.rb', line 330
def deep_cur
self.cur.deep_cur
end
|
#event_added(event, scope, first) ⇒ Object
262
263
264
265
266
|
# File 'lib/volt/reactive/reactive_value.rb', line 262
def event_added(event, scope, first)
object_tracker.enable! if first
end
|
#event_removed(event, last) ⇒ Object
268
269
270
271
272
|
# File 'lib/volt/reactive/reactive_value.rb', line 268
def event_removed(event, last)
object_tracker.disable! if @listeners.size == 0
end
|
253
254
255
|
# File 'lib/volt/reactive/reactive_value.rb', line 253
def inspect
"@<#{self.class.to_s}:#{reactive_object_id} #{cur.inspect}>"
end
|
#object_tracker ⇒ Object
274
275
276
|
# File 'lib/volt/reactive/reactive_value.rb', line 274
def object_tracker
@object_tracker ||= ::ObjectTracker.new(self)
end
|
249
250
251
|
# File 'lib/volt/reactive/reactive_value.rb', line 249
def reactive?
true
end
|
#reactive_object_id ⇒ Object
257
258
259
|
# File 'lib/volt/reactive/reactive_value.rb', line 257
def reactive_object_id
@reactive_object_id ||= rand(100000)
end
|
#remove_parent!(parent) ⇒ Object
415
416
417
418
|
# File 'lib/volt/reactive/reactive_value.rb', line 415
def remove_parent!(parent)
@parents.delete(parent)
event_chain.remove_object(parent)
end
|
#set_scope(new_scope) ⇒ Object
427
428
429
|
# File 'lib/volt/reactive/reactive_value.rb', line 427
def set_scope(new_scope)
dup.scope!(new_scope)
end
|
#set_scope!(new_scope) ⇒ Object
421
422
423
424
425
|
# File 'lib/volt/reactive/reactive_value.rb', line 421
def set_scope!(new_scope)
@scope = new_scope
self
end
|
#setter!(setter = nil, &block) ⇒ Object
432
433
434
|
# File 'lib/volt/reactive/reactive_value.rb', line 432
def setter!(setter=nil, &block)
@setter = setter || block
end
|
#unwrap_if_pass_reactive(args, method_name, current_obj) ⇒ Object
355
356
357
358
359
360
361
|
# File 'lib/volt/reactive/reactive_value.rb', line 355
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
|
#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.
366
367
368
|
# File 'lib/volt/reactive/reactive_value.rb', line 366
def with(*args, &block)
return with_and_options(args, &block)
end
|
#with_and_options(args, &block) ⇒ Object
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
401
402
403
404
405
406
407
408
|
# File 'lib/volt/reactive/reactive_value.rb', line 370
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
|