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 Classes: FragmentNotFound, Options

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

TODO: remove default arg for user options.



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

def initialize(definition, represented, decorator, user_options={})  # TODO: remove default arg for user options.
  super(definition)
  @represented  = represented
  @decorator    = decorator
  @user_options = user_options

  setup_exec_context!
end

Instance Attribute Details

#representedObject (readonly)

TODO: make private/remove.



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

def represented
  @represented
end

#user_optionsObject (readonly)

TODO: make private/remove.



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

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

#asObject

DISCUSS: private?



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

def as # DISCUSS: private?
  evaluate_option(:as)
end

#compile_fragment(doc) ⇒ Object

Retrieve value and write fragment to the doc.



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

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

#getObject



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

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

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

Yields:

  • (value)


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

def read_fragment(doc)
  value = read_fragment_for(doc)

  if value == FragmentNotFound
    return unless has_default?
    value = self[:default]
  end

  yield value
end

#read_fragment_for(doc) ⇒ Object



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

def read_fragment_for(doc)
  read(doc)
end

#representer_module_for(object, *args) ⇒ Object

DISCUSS: do we really need that?



87
88
89
# File 'lib/representable/binding.rb', line 87

def representer_module_for(object, *args)
  evaluate_option(:extend, object) # TODO: pass args? do we actually have args at the time this is called (compile-time)?
end

#set(value) ⇒ Object



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

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

#uncompile_fragment(doc) ⇒ Object

Parse value from doc and update the model property.



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

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

#write_fragment(doc, value) ⇒ Object



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

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

  write_fragment_for(value, doc)
end

#write_fragment_for(value, doc) ⇒ Object



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

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