class Ducktape::BindableAttribute
Attributes
name[R]
owner[R]
value[R]
Public Class Methods
new(owner, name)
click to toggle source
:source_link # Link
- link between source and target
# File lib/ducktape/bindable_attribute.rb, line 18 def initialize(owner, name) @owner, @name, @source_link = owner, name.to_s, nil reset_value end
Public Instance Methods
binding_source()
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 23 def binding_source @source_link.binding_source if @source_link end
has_source?()
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 27 def has_source? !!@source_link end
metadata()
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 31 def metadata @owner.send(:metadata, @name) end
remove_source(reset = true)
click to toggle source
After unbinding the source the value can be reset, or kept. The default is to reset the target’s (self) value.
# File lib/ducktape/bindable_attribute.rb, line 37 def remove_source(reset = true) return unless @source_link src, @source_link = @source_link, nil src.unbind reset_value if reset src.binding_source end
reset_value()
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 45 def reset_value set_value metadata.default end
set_value(value) { |value| ... }
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 49 def set_value(value) if value.is_a?(BindingSource) #attach new binding source replace_source value return @value unless @source_link.forward? #value didn't change value = @source_link.source_value end original_value, value = value, transform_value(value) return @value if value.equal?(@value) || value == @value # transformed value is the same? #set effective value old_value, @original_value, @value = @value, original_value, value yield @value if block_given? call_hooks :on_changed, owner, attribute: name.dup, value: @value, old_value: old_value @source_link.update_source if @source_link && @source_link.reverse? @value end
to_s()
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 70 def to_s "#<#{self.class}:0x#{object_id.to_s(16)} @name=#{name}>" end
Private Instance Methods
replace_source(new_source)
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 76 def replace_source(new_source) remove_source false @source_link = Link.new(new_source, self) @source_link.bind @source_link.update_source unless @source_link.forward? end
transform_value(value)
click to toggle source
# File lib/ducktape/bindable_attribute.rb, line 83 def transform_value(value) metadata = self.metadata value = metadata.coerce(owner, value) metadata.validate(value) value end