Class: Representable::Binding

Inherits:
SimpleDelegator
  • Object
show all
Includes:
Prepare
Defined in:
lib/representable/binding.rb

Overview

The Binding wraps the Definition instance for this property and provides methods to read/write fragments.

Direct Known Subclasses

Hash::PropertyBinding, XML::PropertyBinding

Defined Under Namespace

Modules: Object, Prepare Classes: FragmentNotFound

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Prepare

#representer_module_for

Constructor Details

#initialize(definition, represented, user_options = {}, exec_context = represented) ⇒ Binding

TODO: remove default arg for user options. # DISCUSS: make exec_context an options hash?



17
18
19
20
21
22
# File 'lib/representable/binding.rb', line 17

def initialize(definition, represented, user_options={}, exec_context=represented)  # TODO: remove default arg for user options. # DISCUSS: make exec_context an options hash?
  super(definition)
  @represented  = represented
  @user_options = user_options
  @exec_context = exec_context
end

Instance Attribute Details

#representedObject (readonly)

TODO: make private/remove.



24
25
26
# File 'lib/representable/binding.rb', line 24

def represented
  @represented
end

#user_optionsObject (readonly)

TODO: make private/remove.



24
25
26
# File 'lib/representable/binding.rb', line 24

def user_options
  @user_options
end

Class Method Details

.build(definition, *args) ⇒ Object



11
12
13
14
15
# File 'lib/representable/binding.rb', line 11

def self.build(definition, *args)
  # DISCUSS: move #create_binding to this class?
  return definition.create_binding(*args) if definition.binding
  build_for(definition, *args)
end

Instance Method Details

#compile_fragment(doc) ⇒ Object

Retrieve value and write fragment to the doc.



27
28
29
30
31
# File 'lib/representable/binding.rb', line 27

def compile_fragment(doc)
  represented_exec_for(:writer, doc) do
    write_fragment(doc, get)
  end
end

#getObject



68
69
70
71
72
# File 'lib/representable/binding.rb', line 68

def get
  represented_exec_for(:getter) do
    exec_context.send(getter)
  end
end

#read_fragment(doc) {|value| ... } ⇒ Object

Yields:

  • (value)


53
54
55
56
57
58
59
60
61
62
# File 'lib/representable/binding.rb', line 53

def read_fragment(doc)
  value = read_fragment_for(doc)

  if value == FragmentNotFound
    return unless has_default?
    value = default
  end

  yield value
end

#read_fragment_for(doc) ⇒ Object



64
65
66
# File 'lib/representable/binding.rb', line 64

def read_fragment_for(doc)
  read(doc)
end

#set(value) ⇒ Object



74
75
76
77
78
# File 'lib/representable/binding.rb', line 74

def set(value)
  represented_exec_for(:setter, value) do
    exec_context.send(setter, value)
  end
end

#uncompile_fragment(doc) ⇒ Object

Parse value from doc and update the model property.



34
35
36
37
38
39
40
# File 'lib/representable/binding.rb', line 34

def uncompile_fragment(doc)
  represented_exec_for(:reader, doc) do
    read_fragment(doc) do |value|
      set(value)
    end
  end
end

#write_fragment(doc, value) ⇒ Object



42
43
44
45
46
# File 'lib/representable/binding.rb', line 42

def write_fragment(doc, value)
  value = default_for(value)

  write_fragment_for(value, doc)
end

#write_fragment_for(value, doc) ⇒ Object



48
49
50
51
# File 'lib/representable/binding.rb', line 48

def write_fragment_for(value, doc)
  return if skipable_nil_value?(value)
  write(doc, value)
end