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/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
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, Time
Constant Summary
Constants included from TypeLookup
TypeLookup::EXTRA_CONST_ARGS, TypeLookup::TYPE_FORMAT
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.
-
#instance_variable_name ⇒ Symbol
readonly
private
Returns instance variable name of the attribute.
-
#name ⇒ Symbol
readonly
Returns name of the attribute.
-
#options ⇒ Hash
readonly
private
Returns options hash for the attribute.
-
#reader_visibility ⇒ Symbol
readonly
private
Returns reader visibility.
-
#writer_visibility ⇒ Symbol
readonly
private
Returns write visibility.
Class Method Summary collapse
-
.build(name, type, 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
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
145 146 147 148 149 150 151 152 153 |
# File 'lib/virtus/attribute.rb', line 145 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.new(self, @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
59 60 61 |
# File 'lib/virtus/attribute.rb', line 59 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
66 67 68 |
# File 'lib/virtus/attribute.rb', line 66 def default @default end |
#instance_variable_name ⇒ 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 instance variable name of the attribute
38 39 40 |
# File 'lib/virtus/attribute.rb', line 38 def instance_variable_name @instance_variable_name end |
#name ⇒ Symbol (readonly)
Returns name of the attribute
24 25 26 |
# File 'lib/virtus/attribute.rb', line 24 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
31 32 33 |
# File 'lib/virtus/attribute.rb', line 31 def @options end |
#reader_visibility ⇒ 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 reader visibility
45 46 47 |
# File 'lib/virtus/attribute.rb', line 45 def reader_visibility @reader_visibility end |
#writer_visibility ⇒ 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 write visibility
52 53 54 |
# File 'lib/virtus/attribute.rb', line 52 def writer_visibility @writer_visibility end |
Class Method Details
.build(name, type, 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
82 83 84 85 86 87 |
# File 'lib/virtus/attribute.rb', line 82 def self.build(name, type, = {}) 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
102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/virtus/attribute.rb', line 102 def self.determine_type(class_or_name) case class_or_name when ::Class if class_or_name <= Virtus Attribute::EmbeddedValue else super end 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
130 131 132 |
# File 'lib/virtus/attribute.rb', line 130 def self.(type, ) end |
Instance Method Details
#coerce(value) ⇒ Object
Converts the given value to the primitive type
240 241 242 |
# File 'lib/virtus/attribute.rb', line 240 def coerce(value) Coercion[value.class].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
271 272 273 274 275 |
# File 'lib/virtus/attribute.rb', line 271 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
284 285 286 287 |
# File 'lib/virtus/attribute.rb', line 284 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
296 297 298 299 |
# File 'lib/virtus/attribute.rb', line 296 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
180 181 182 183 184 185 186 187 188 |
# File 'lib/virtus/attribute.rb', line 180 def get(instance) if instance.instance_variable_defined?(instance_variable_name) get!(instance) else value = default.evaluate(instance) set!(instance, value) value end end |
#get!(instance) ⇒ Object
Returns the instance variable of the attribute
199 200 201 |
# File 'lib/virtus/attribute.rb', line 199 def get!(instance) instance.instance_variable_get(instance_variable_name) end |
#inspect ⇒ String
Returns a concise string representation of the attribute instance
164 165 166 |
# File 'lib/virtus/attribute.rb', line 164 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
306 307 308 |
# File 'lib/virtus/attribute.rb', line 306 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
315 316 317 |
# File 'lib/virtus/attribute.rb', line 315 def public_writer? writer_visibility == :public end |
#set(instance, value) ⇒ self
Sets the value on the instance
211 212 213 |
# File 'lib/virtus/attribute.rb', line 211 def set(instance, value) set!(instance, coerce(value)) end |
#set!(instance, value) ⇒ self
Sets instance variable of the attribute
223 224 225 226 |
# File 'lib/virtus/attribute.rb', line 223 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?
260 261 262 |
# File 'lib/virtus/attribute.rb', line 260 def value_coerced?(value) @primitive === value end |