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
|
# File 'lib/kanade/dto.rb', line 6
def self.field(name_sym, *options)
raise NotSupportedError.new('Field must be a symbol!') unless name_sym.is_a?(Symbol)
raise NotSupportedError.new('Cant use reserved name (__fields)') if name == :__fields
if self.__definer != self.name
self.__fields = array_dup(self.__fields) || []
self.__definer = self.name
end
option = options.last
conversion_method = option[:as]
if option[:as].is_a?(Class) and option[:as] < Dto
conversion_method = :dto
option[:of] = option[:as]
option[:as] = :dto
end
name = name_sym.to_s.freeze
variable_ref = "@#{name}".freeze
converter = Engine.converter(conversion_method)
key_name = option[:with]
raise Kanade::NotSupportedError.new("Converter #{conversion_method} is not registered") if converter.nil?
field = FieldInfo.new
field.converter = converter
field.key_json = key_name
field.key_ruby = name
field.sym = name_sym
field.options = option
define_method "#{name}=" do |value|
instance_variable_set(variable_ref, field.convert(value))
end
define_method "#{name}" do
instance_variable_get(variable_ref)
end
self.__fields << field
end
|