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