lib/kanade/dto.rb in kanade-0.1.0.beta1 vs lib/kanade/dto.rb in kanade-0.1.0.beta2

- old
+ new

@@ -1,47 +1,56 @@ -module Kanade - class Dto - class_attribute :__fields - class_attribute :__definer - - 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 - - name = name_sym.to_s.freeze - variable_ref = "@#{name}".freeze - option = options.last - converter = Engine.converter(option[:as]) - key_name = option[:with] - - raise Kanade::NotSupportedError.new("Converter #{option[:as]} 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 - - private - def self.array_dup(arr) - return nil if arr.nil? - arr.map(&:dup) - end - end -end +module Kanade + class Dto + class_attribute :__fields + class_attribute :__definer + + 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 + + private + def self.array_dup(arr) + return nil if arr.nil? + arr.map(&:dup) + end + end +end