Class: Rubernate::Peer

Inherits:
Hash
  • Object
show all
Defined in:
lib/rubernate/peer.rb

Overview

Represent objects peer - properties holder.

Defined Under Namespace

Modules: Container

Instance Method Summary collapse

Instance Method Details

#[]=(key, value) ⇒ Object



50
51
52
# File 'lib/rubernate/peer.rb', line 50

def []= key, value
  set key, value
end

#change_trackObject

Retrus change track of attribute modifications

Hash {p_name => :inserted, :}


8
9
10
11
12
13
14
15
16
# File 'lib/rubernate/peer.rb', line 8

def change_track 
  @change_track ||= Hash.new
  each do |name, value|
    if value.is_a? Container and not @change_track.has_key? name
      @change_track[name] = :modified if value.recall
    end
  end
  @change_track
end

#dirty=(f_dirty) ⇒ Object

Sets peers dirty flag to specified value. And resets dirty flag for all properites which stored in this peer.



20
21
22
23
24
25
26
# File 'lib/rubernate/peer.rb', line 20

def dirty= f_dirty
  @dirty = f_dirty
  @change_track = nil unless f_dirty
  for value in values
    value.memorize! if value.is_a? Container
  end
end

#dirty? {|name, old_value, value| ... } ⇒ Boolean

If peers dirty flag set to true returns it immediately else iterate over all properties and returns true if dirty property apperas. on_modify callback invoked if dirty is true.

Yields:

  • (name, old_value, value)

Returns:

  • (Boolean)


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/rubernate/peer.rb', line 31

def dirty?
  return true if @dirty
  f_dirty, name, value, old_value = false
  each do |name, value|
    if value.is_a? Container
      old_value = value.recall
      if old_value
        f_dirty = dirty = true
        update_track name, :modified
        break
      end
    end
  end
  yield name, old_value, value if block_given? and f_dirty
  f_dirty
end

#old_setObject



48
# File 'lib/rubernate/peer.rb', line 48

alias old_set []=

#set(key, value) {|key, old_value, value| ... } ⇒ Object

Yields:

  • (key, old_value, value)


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rubernate/peer.rb', line 54

def set key, value, &on_change
  old_value = self[key]
  return if old_value == value
  @dirty = true
  if value.is_a? Array or value.is_a? Hash
    value.extend Container
  end
  if value
    old_set key, value
  else
    delete key
  end
  update_track key, change_type(old_value, value)
  yield key, old_value, value if block_given?
end