Class: Virtus::Attribute Abstract
- Inherits:
-
Object
- Object
- Virtus::Attribute
- Extended by:
- DescendantsTracker, Options, TypeLookup
- Defined in:
- lib/virtus/attribute.rb,
lib/virtus/attribute/set.rb,
lib/virtus/attribute/date.rb,
lib/virtus/attribute/hash.rb,
lib/virtus/attribute/time.rb,
lib/virtus/attribute/array.rb,
lib/virtus/attribute/class.rb,
lib/virtus/attribute/float.rb,
lib/virtus/attribute/object.rb,
lib/virtus/attribute/string.rb,
lib/virtus/attribute/symbol.rb,
lib/virtus/attribute/boolean.rb,
lib/virtus/attribute/decimal.rb,
lib/virtus/attribute/integer.rb,
lib/virtus/attribute/numeric.rb,
lib/virtus/attribute/date_time.rb,
lib/virtus/attribute/collection.rb,
lib/virtus/attribute/default_value.rb,
lib/virtus/attribute/embedded_value.rb,
lib/virtus/attribute/default_value/from_symbol.rb,
lib/virtus/attribute/embedded_value/from_struct.rb,
lib/virtus/attribute/default_value/from_callable.rb,
lib/virtus/attribute/default_value/from_clonable.rb,
lib/virtus/attribute/embedded_value/from_open_struct.rb
Overview
Abstract class implementing base API for attribute types
Direct Known Subclasses
Defined Under Namespace
Classes: Array, Boolean, Class, Collection, Date, DateTime, Decimal, DefaultValue, EmbeddedValue, Float, Hash, Integer, Numeric, Object, Set, String, Symbol, Time
Constant Summary
Constants included from TypeLookup
Instance Attribute Summary collapse
-
#coercion_method ⇒ Symbol
readonly
private
Returns method name that should be used for coerceing.
-
#default ⇒ Object
readonly
private
Returns default value.
-
#name ⇒ Symbol
readonly
Returns name of the attribute.
-
#options ⇒ Hash
readonly
private
Returns options hash for the attribute.
Class Method Summary collapse
-
.build(name, type = Object, options = {}) ⇒ Attribute
private
Builds an attribute instance.
-
.determine_type(class_or_name) ⇒ Class
Determine attribute type based on class or name.
-
.merge_options(type, options) ⇒ Hash
private
A hook for Attributes to update options based on the type from the caller.
Instance Method Summary collapse
-
#coerce(value) ⇒ Object
Converts the given value to the primitive type.
-
#define_accessor_methods(mod) ⇒ self
private
Define reader and writer methods for an Attribute.
-
#define_reader_method(mod) ⇒ self
private
Creates an attribute reader method.
-
#define_writer_method(mod) ⇒ self
private
Creates an attribute writer method.
-
#get(instance) ⇒ Object
Returns value of an attribute for the given instance.
-
#get!(instance) ⇒ Object
Returns the instance variable of the attribute.
-
#initialize(name, options = {}) ⇒ undefined
constructor
private
Initializes an attribute instance.
-
#inspect ⇒ String
Returns a concise string representation of the attribute instance.
-
#public_reader? ⇒ Boolean
private
Returns a Boolean indicating whether the reader method is public.
-
#public_writer? ⇒ Boolean
private
Returns a Boolean indicating whether the writer method is public.
-
#set(instance, value) ⇒ self
Sets the value on the instance.
-
#set!(instance, value) ⇒ self
Sets instance variable of the attribute.
-
#value_coerced?(value) ⇒ Boolean
private
Is the given value coerced into the target type for this attribute?.
Methods included from DescendantsTracker
Methods included from TypeLookup
determine_type, extended, primitive
Methods included from Options
accept_options, accepted_options
Constructor Details
#initialize(name, options = {}) ⇒ undefined
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Initializes an attribute instance
121 122 123 124 125 126 127 128 129 |
# File 'lib/virtus/attribute.rb', line 121 def initialize(name, = {}) @name = name.to_sym @options = self.class..merge().freeze @instance_variable_name = "@#{@name}".to_sym @primitive = @options.fetch(:primitive) @coercion_method = @options.fetch(:coercion_method) @default = DefaultValue.build(@options[:default]) initialize_visibility end |
Instance Attribute Details
#coercion_method ⇒ Symbol (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns method name that should be used for coerceing
39 40 41 |
# File 'lib/virtus/attribute.rb', line 39 def coercion_method @coercion_method end |
#default ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns default value
46 47 48 |
# File 'lib/virtus/attribute.rb', line 46 def default @default end |
#name ⇒ Symbol (readonly)
Returns name of the attribute
25 26 27 |
# File 'lib/virtus/attribute.rb', line 25 def name @name end |
#options ⇒ Hash (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns options hash for the attribute
32 33 34 |
# File 'lib/virtus/attribute.rb', line 32 def @options end |
Class Method Details
.build(name, type = Object, options = {}) ⇒ Attribute
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Builds an attribute instance
62 63 64 65 66 67 |
# File 'lib/virtus/attribute.rb', line 62 def self.build(name, type = Object, = {}) attribute_class = determine_type(type) or raise ArgumentError, "#{type.inspect} does not map to an attribute type" = attribute_class.(type, ) attribute_class.new(name, ) end |
.determine_type(class_or_name) ⇒ Class
Determine attribute type based on class or name
Returns Attribute::EmbeddedValue if a virtus class is passed
82 83 84 85 86 87 88 89 90 91 |
# File 'lib/virtus/attribute.rb', line 82 def self.determine_type(class_or_name) case class_or_name when ::Class Attribute::EmbeddedValue.determine_type(class_or_name) || super when ::Array, ::Set super(class_or_name.class) else super end end |
.merge_options(type, options) ⇒ Hash
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
add type arg to Attribute#initialize signature and handle there?
A hook for Attributes to update options based on the type from the caller
106 107 108 |
# File 'lib/virtus/attribute.rb', line 106 def self.(type, ) end |
Instance Method Details
#coerce(value) ⇒ Object
Converts the given value to the primitive type
216 217 218 |
# File 'lib/virtus/attribute.rb', line 216 def coerce(value) Coercion[value.class].public_send(coercion_method, value) end |
#define_accessor_methods(mod) ⇒ self
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Define reader and writer methods for an Attribute
247 248 249 250 251 |
# File 'lib/virtus/attribute.rb', line 247 def define_accessor_methods(mod) define_reader_method(mod) define_writer_method(mod) self end |
#define_reader_method(mod) ⇒ self
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Creates an attribute reader method
260 261 262 263 |
# File 'lib/virtus/attribute.rb', line 260 def define_reader_method(mod) mod.define_reader_method(self, name, @reader_visibility) self end |
#define_writer_method(mod) ⇒ self
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Creates an attribute writer method
272 273 274 275 |
# File 'lib/virtus/attribute.rb', line 272 def define_writer_method(mod) mod.define_writer_method(self, "#{name}=".to_sym, @writer_visibility) self end |
#get(instance) ⇒ Object
Returns value of an attribute for the given instance
Sets the default value if an ivar is not set and default value is configured
156 157 158 159 160 161 162 163 164 |
# File 'lib/virtus/attribute.rb', line 156 def get(instance) if instance.instance_variable_defined?(@instance_variable_name) get!(instance) else value = default.call(instance, self) set!(instance, value) value end end |
#get!(instance) ⇒ Object
Returns the instance variable of the attribute
175 176 177 |
# File 'lib/virtus/attribute.rb', line 175 def get!(instance) instance.instance_variable_get(@instance_variable_name) end |
#inspect ⇒ String
Returns a concise string representation of the attribute instance
140 141 142 |
# File 'lib/virtus/attribute.rb', line 140 def inspect "#<#{self.class.inspect} @name=#{name.inspect}>" end |
#public_reader? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a Boolean indicating whether the reader method is public
282 283 284 |
# File 'lib/virtus/attribute.rb', line 282 def public_reader? @reader_visibility == :public end |
#public_writer? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a Boolean indicating whether the writer method is public
291 292 293 |
# File 'lib/virtus/attribute.rb', line 291 def public_writer? @writer_visibility == :public end |
#set(instance, value) ⇒ self
Sets the value on the instance
187 188 189 |
# File 'lib/virtus/attribute.rb', line 187 def set(instance, value) set!(instance, coerce(value)) end |
#set!(instance, value) ⇒ self
Sets instance variable of the attribute
199 200 201 202 |
# File 'lib/virtus/attribute.rb', line 199 def set!(instance, value) instance.instance_variable_set(@instance_variable_name, value) self end |
#value_coerced?(value) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is the given value coerced into the target type for this attribute?
236 237 238 |
# File 'lib/virtus/attribute.rb', line 236 def value_coerced?(value) @primitive === value end |