lib/virtus/attribute/embedded_value.rb in virtus-1.0.0.beta6 vs lib/virtus/attribute/embedded_value.rb in virtus-1.0.0.beta7

- old
+ new

@@ -23,56 +23,70 @@ # :street => 'Street 1/2', :zipcode => '12345', :city => 'NYC' }) # class EmbeddedValue < Attribute TYPES = [Struct, OpenStruct, Virtus, Model::Constructor].freeze - class FromStruct < self + class Coercer + attr_reader :primitive + def initialize(primitive) + @primitive = primitive + end + + end # Coercer + + class FromStruct < Coercer + # @api public - def coerce(input) + def call(input) if input.kind_of?(primitive) input elsif not input.nil? primitive.new(*input) end end + end # FromStruct - class FromOpenStruct < self + class FromOpenStruct < Coercer # @api public - def coerce(input) + def call(input) if input.kind_of?(primitive) input elsif not input.nil? primitive.new(input) end end + end # FromOpenStruct # @api private def self.handles?(klass) klass.is_a?(Class) && TYPES.any? { |type| klass <= type } end # @api private - def self.determine_type(klass) - if klass < Virtus || klass < Model::Constructor || klass <= OpenStruct - FromOpenStruct - elsif klass < Struct - FromStruct - end + def self.build_type(options) + Axiom::Types::Object.new { primitive options[:type] } end # @api private - def self.build_type(options) - Axiom::Types::Object.new { primitive options[:type] } + def self.build_coercer(type, _options) + primitive = type.primitive + + if primitive < Virtus || primitive < Model::Constructor || primitive <= OpenStruct + FromOpenStruct.new(primitive) + elsif primitive < Struct + FromStruct.new(primitive) + end end # @api public def primitive type.primitive end end # class EmbeddedValue + end # class Attribute end # module Virtus