Class: Representable::Binding

Inherits:
SimpleDelegator
  • Object
show all
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

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?



15
16
17
18
19
20
# File 'lib/representable/binding.rb', line 15

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.



22
23
24
# File 'lib/representable/binding.rb', line 22

def represented
  @represented
end

#user_optionsObject (readonly)

TODO: make private/remove.



22
23
24
# File 'lib/representable/binding.rb', line 22

def user_options
  @user_options
end

Class Method Details

.build(definition, *args) ⇒ Object



9
10
11
12
13
# File 'lib/representable/binding.rb', line 9

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.



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

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

#deserialize(fragment) ⇒ Object



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

def deserialize(fragment)
  fragment
end

#getObject



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

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

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

Yields:

  • (value)


60
61
62
63
64
65
66
67
68
69
# File 'lib/representable/binding.rb', line 60

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



71
72
73
# File 'lib/representable/binding.rb', line 71

def read_fragment_for(doc)
  read(doc)
end

#serialize(value) ⇒ Object

Main entry point for rendering/parsing a property object.



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

def serialize(value)
  value
end

#set(value) ⇒ Object



81
82
83
84
85
# File 'lib/representable/binding.rb', line 81

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.



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

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



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

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

  write_fragment_for(value, doc)
end

#write_fragment_for(value, doc) ⇒ Object



55
56
57
58
# File 'lib/representable/binding.rb', line 55

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