Module: Mimic::DefineMethods

Defined in:
lib/mimic/define_methods.rb

Constant Summary collapse

Error =
::Class.new(RuntimeError)

Class Method Summary collapse

Class Method Details

.body(record) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/mimic/define_methods.rb', line 64

def self.body(record)
  body = ''
  if record
    body << <<~RECORD
      invocation = Invocation.build(binding)
      __record(invocation)
    RECORD
  end

  body << "Void.new"

  body
end

.call(cls, subject_methods = nil, record: nil) ⇒ Object



5
6
7
8
9
10
11
12
13
# File 'lib/mimic/define_methods.rb', line 5

def self.call(cls, subject_methods=nil, record: nil)
  subject_methods ||= Mimic.subject_methods(cls)

  subject_methods.each do |mthd|
    define_method(cls, mthd, record)
  end

  nil
end

.define_method(cls, mthd, record) ⇒ Object



15
16
17
18
# File 'lib/mimic/define_methods.rb', line 15

def self.define_method(cls, mthd, record)
  method_definition = method_definition(mthd, record)
  cls.class_eval(method_definition)
end

.method_definition(mthd, record) ⇒ Object



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

def self.method_definition(mthd, record)
  "
    #{signature(mthd)}
      #{body(record)}
    end
  "
end

.parameter_list(parameters) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/mimic/define_methods.rb', line 34

def self.parameter_list(parameters)
  parameter_list = ''
  parameters.each do |parameter|
    parameter_signature = parameter_signature(parameter)
    parameter_list << "#{parameter_signature}, "
  end

  parameter_list[0...-2]
end

.parameter_signature(parameter) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/mimic/define_methods.rb', line 44

def self.parameter_signature(parameter)
  type = parameter[0]
  name = parameter.fetch(1) { :args }

  case type
  when :req
    return "#{name}"
  when :keyreq
    return "#{name}:"
  when :rest
    return "*#{name}"
  when :keyrest
    return "**#{name}"
  when :block
    return "&#{name}"
  else
    raise Error, "Unknown parameter type (Name: #{name.inspect}, Type: #{type.inspect})"
  end
end

.signature(mthd) ⇒ Object



28
29
30
31
32
# File 'lib/mimic/define_methods.rb', line 28

def self.signature(mthd)
  parameter_list = parameter_list(mthd.parameters)

  "def #{mthd.name}(#{parameter_list})"
end