12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/reactor/attributes/link_list_extender.rb', line 12
def self.extend_given_linklist!(klass)
unless klass.instance_methods(false).include?("changed?")
klass.class_eval do
def <<(link_data)
super(transform_into_link(link_data))
end
def []=(idx, value)
super(idx, transform_into_link(value))
end
Array.instance_methods(false).each do |meth|
old = instance_method(meth)
define_method(meth) do |*args, &block|
detect_modification do
old.bind(self).call(*args, &block)
end
end if meth.to_sym != :map
end
def changed?
@changed == true || temporary_links_present?
end
def change!
@changed = true
end
def original_link_ids
@original_link_ids ||= link_ids
end
protected
def link_ids
self.map(&:id).compact
end
def temporary_links_present?
self.any? {|l| l.kind_of? Reactor::Link::TemporaryLink }
end
def detect_modification(&block)
original_link_ids
yield.tap do
@changed = @changed || original_link_ids != link_ids
end
end
def transform_into_link(link_data)
if (link_data.respond_to?(:external?) && link_data.respond_to?(:internal?))
link_data
else
Reactor::Link::TemporaryLink.new(link_data)
end
end
end
end
end
|