8
9
10
11
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
|
# File 'lib/memorandum.rb', line 8
def memo *arguments
name = arguments.pop
flags = arguments
memoized_statuses = memorandum_ivar_name MEMORANDUM_STATUSES, name
memoized_values = memorandum_ivar_name MEMORANDUM_VALUES, name
unmemoized_name = "#{MEMORANDUM_UNMEMOIZED}_#{name}"
access = find_access name
alias_method unmemoized_name, name
define_method name do |*args|
statuses = memorandum_fetch memoized_statuses, Hash[]
values = memorandum_fetch memoized_values, Hash[]
unless statuses[args]
value = send unmemoized_name, *args
value = value.freeze if flags.include? :freeze
value = IceNine.deep_freeze value if flags.include? :deep_freeze
values[args] = value
statuses[args] = true
end
values[args]
end
send access, name
send access, unmemoized_name
end
|