Sha256: 5ed3ba0959fb74e04f1be32524f371ef45245fe964e0e62cb72d6a44d3a2fec3
Contents?: true
Size: 1.46 KB
Versions: 3
Compression:
Stored size: 1.46 KB
Contents
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
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
kanade-0.1.1 | lib/kanade/dto.rb |
kanade-0.1.0 | lib/kanade/dto.rb |
kanade-0.1.0.beta2 | lib/kanade/dto.rb |