Module: Memorandum

Defined in:
lib/memorandum.rb,
lib/memorandum/version.rb

Defined Under Namespace

Modules: InstanceMethods

Constant Summary collapse

VERSION =
'2.1.2'.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



4
5
6
# File 'lib/memorandum.rb', line 4

def self.extended base
  base.send :include, InstanceMethods
end

Instance Method Details

#memo(*arguments) ⇒ Object



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