Skip to content

Instantly share code, notes, and snippets.

@DimaD
Last active December 21, 2015 00:19
Show Gist options
  • Save DimaD/6219306 to your computer and use it in GitHub Desktop.
Save DimaD/6219306 to your computer and use it in GitHub Desktop.
require "virtus"
class FinancialDocumentStatus
def initialize(status_string)
@status_string = status_string
end
def settled?
true
end
end
class Payment
include Virtus
attribute :status, FinancialDocumentStatus, writer_class: MapValue(FinancialDocumentStatus)
end
# Generator of writers to simply wrap value into
# desired class
#
# @param [Class] klass
# type to which you want to map your attribute values
#
# @return [Class]
# class which implements Virtus::Attribute::Writer::Coercible API
#
def MapValue(klass)
Class.new(Virtus::Attribute::Writer::Coercible).tap do |writer|
writer.class_eval <<-EOV, __FILE__, __LINE__ + 1
def coerce(value)
return unless value
#{klass.name}.new(value)
end
EOV
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment