Module: Onceler::Recordable

Defined in:
lib/onceler/recordable.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(instance) ⇒ Object



3
4
5
6
7
8
9
# File 'lib/onceler/recordable.rb', line 3

def self.extended(instance)
  instance.instance_eval do
    @__retvals = {}
    @__retvals_recorded = {} # we might override an inherited one, so we need to differentiate
    @__ignore_ivars = instance_variables
  end
end

Instance Method Details

#__dataObject



38
39
40
# File 'lib/onceler/recordable.rb', line 38

def __data
  @__data ||= Marshal.dump([__ivars, @__retvals])
end

#__ivarsObject



27
28
29
30
31
32
33
34
35
36
# File 'lib/onceler/recordable.rb', line 27

def __ivars
  ivars = instance_variables - @__ignore_ivars
  ivars.inject({}) do |hash, key|
    if key.to_s !~ /\A@__/
      val = instance_variable_get(key)
      hash[key] = val
    end
    hash
  end
end

#__prepare_recording(recording) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
# File 'lib/onceler/recordable.rb', line 11

def __prepare_recording(recording)
  method = recording.name
  define_singleton_method(method) do
    if @__retvals_recorded[method]
      @__retvals[method]
    else
      @__retvals_recorded[method] = true
      @__retvals[method] = __record(recording)
    end
  end
end

#__record(recording) ⇒ Object



23
24
25
# File 'lib/onceler/recordable.rb', line 23

def __record(recording)
  instance_eval(&recording.block)
end

#copy_from(other) ⇒ Object



42
43
44
45
46
47
48
49
50
# File 'lib/onceler/recordable.rb', line 42

def copy_from(other)
  ivars, @__retvals = Marshal.load(other.__data)
  ivars.each do |key, value|
    instance_variable_set(key, value)
  end
  @__retvals.each do |key, value|
    define_singleton_method(key) { value }
  end
end