Class: Kanade::Dto

Inherits:
Object
  • Object
show all
Defined in:
lib/kanade/dto.rb

Class Method Summary collapse

Class Method Details

.field(name_sym, *options) ⇒ Object

Raises:



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