/
class_methods.rb
69 lines (60 loc) · 2.01 KB
/
class_methods.rb
1
2
3
4
5
6
7
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
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
# frozen_string_literal: true
require_relative '../mixin/reflection'
module AMA
module Entity
class Mapper
module DSL
# Module providing DSL methods for entity class
module ClassMethods
include Mixin::Reflection
attr_reader :mapper
def mapper=(mapper)
@mapper = mapper
mapper.register(self)
end
# @return [AMA::Entity::Mapper::Type::Concrete]
def bound_type
mapper[self]
end
# @param [String, Symbol] name
# @param [Array<AMA::Entity::Mapper::Type] types List of possible
# attribute types
# @param [Hash] options Attribute options: :virtual, :sensitive
# @return [AMA::Entity::Mapper::Type::Attribute]
def attribute(name, *types, **options)
types = types.map { |type| @mapper.resolve(type) }
bound_type.attribute!(name, *types, **options)
define_method(name) do
instance_variable_get("@#{name}")
end
define_method("#{name}=") do |value|
instance_variable_set("@#{name}", value)
end
end
# @param [String, Symbol] id
# @return [AMA::Entity::Mapper::Type::Parameter]
def parameter(id)
bound_type.parameter!(id)
end
handlers = {
factory: :create,
enumerator: :enumerate,
injector: :inject,
normalizer: :normalize,
denormalizer: :denormalize
}
handlers.each do |name, method_name|
setter_name = "#{name}="
define_method setter_name do |handler|
wrapper = API::Wrapper.const_get(name.capitalize).new(handler)
bound_type.send(setter_name, wrapper)
end
define_method "#{name}_block" do |&block|
send(setter_name, method_object(method_name, &block))
end
end
end
end
end
end
end