Module: ActiveModelAttributes::ClassMethods
- Defined in:
- lib/active_model_attributes.rb
Constant Summary collapse
- SERVICE_ATTRIBUTES =
%i(default user_provided_default).freeze
Instance Method Summary collapse
- #attribute(name, cast_type, **options) ⇒ Object
- #define_attribute_reader(name, options) ⇒ Object
- #define_attribute_writer(name, cast_type, options) ⇒ Object
Instance Method Details
#attribute(name, cast_type, **options) ⇒ Object
18 19 20 21 22 23 |
# File 'lib/active_model_attributes.rb', line 18 def attribute(name, cast_type, **) self.attributes_registry = attributes_registry.merge(name => [cast_type, ]) define_attribute_reader(name, ) define_attribute_writer(name, cast_type, ) end |
#define_attribute_reader(name, options) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/active_model_attributes.rb', line 25 def define_attribute_reader(name, ) wrapper = Module.new do provided_default = .fetch(:default) { NO_DEFAULT_PROVIDED } define_method name do return instance_variable_get("@#{name}") if instance_variable_defined?("@#{name}") return if provided_default == NO_DEFAULT_PROVIDED provided_default.respond_to?(:call) && provided_default.call || provided_default end end include wrapper end |
#define_attribute_writer(name, cast_type, options) ⇒ Object
37 38 39 40 41 42 43 44 45 |
# File 'lib/active_model_attributes.rb', line 37 def define_attribute_writer(name, cast_type, ) wrapper = Module.new do define_method "#{name}=" do |val| deserialized_value = ActiveModel::Type.lookup(cast_type, **.except(*SERVICE_ATTRIBUTES)).cast(val) instance_variable_set("@#{name}", deserialized_value) end end include wrapper end |