virtus2 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +39 -0
- data/.rspec +2 -0
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +18 -0
- data/Changelog.md +258 -0
- data/Gemfile +10 -0
- data/Guardfile +19 -0
- data/LICENSE +20 -0
- data/README.md +630 -0
- data/Rakefile +15 -0
- data/TODO.md +6 -0
- data/lib/virtus/attribute/accessor.rb +103 -0
- data/lib/virtus/attribute/boolean.rb +55 -0
- data/lib/virtus/attribute/builder.rb +182 -0
- data/lib/virtus/attribute/coercer.rb +45 -0
- data/lib/virtus/attribute/coercible.rb +20 -0
- data/lib/virtus/attribute/collection.rb +103 -0
- data/lib/virtus/attribute/default_value/from_callable.rb +35 -0
- data/lib/virtus/attribute/default_value/from_clonable.rb +35 -0
- data/lib/virtus/attribute/default_value/from_symbol.rb +35 -0
- data/lib/virtus/attribute/default_value.rb +51 -0
- data/lib/virtus/attribute/embedded_value.rb +67 -0
- data/lib/virtus/attribute/enum.rb +45 -0
- data/lib/virtus/attribute/hash.rb +130 -0
- data/lib/virtus/attribute/lazy_default.rb +18 -0
- data/lib/virtus/attribute/nullify_blank.rb +24 -0
- data/lib/virtus/attribute/strict.rb +26 -0
- data/lib/virtus/attribute.rb +245 -0
- data/lib/virtus/attribute_set.rb +240 -0
- data/lib/virtus/builder/hook_context.rb +51 -0
- data/lib/virtus/builder.rb +133 -0
- data/lib/virtus/class_inclusions.rb +48 -0
- data/lib/virtus/class_methods.rb +90 -0
- data/lib/virtus/coercer.rb +41 -0
- data/lib/virtus/configuration.rb +72 -0
- data/lib/virtus/const_missing_extensions.rb +18 -0
- data/lib/virtus/extensions.rb +105 -0
- data/lib/virtus/instance_methods.rb +218 -0
- data/lib/virtus/model.rb +68 -0
- data/lib/virtus/module_extensions.rb +88 -0
- data/lib/virtus/support/equalizer.rb +128 -0
- data/lib/virtus/support/options.rb +113 -0
- data/lib/virtus/support/type_lookup.rb +109 -0
- data/lib/virtus/value_object.rb +150 -0
- data/lib/virtus/version.rb +3 -0
- data/lib/virtus.rb +310 -0
- data/spec/integration/attributes_attribute_spec.rb +28 -0
- data/spec/integration/building_module_spec.rb +90 -0
- data/spec/integration/collection_member_coercion_spec.rb +96 -0
- data/spec/integration/custom_attributes_spec.rb +42 -0
- data/spec/integration/custom_collection_attributes_spec.rb +101 -0
- data/spec/integration/default_values_spec.rb +87 -0
- data/spec/integration/defining_attributes_spec.rb +86 -0
- data/spec/integration/embedded_value_spec.rb +50 -0
- data/spec/integration/extending_objects_spec.rb +35 -0
- data/spec/integration/hash_attributes_coercion_spec.rb +54 -0
- data/spec/integration/inheritance_spec.rb +42 -0
- data/spec/integration/injectible_coercers_spec.rb +48 -0
- data/spec/integration/mass_assignment_with_accessors_spec.rb +44 -0
- data/spec/integration/overriding_virtus_spec.rb +46 -0
- data/spec/integration/required_attributes_spec.rb +25 -0
- data/spec/integration/struct_as_embedded_value_spec.rb +28 -0
- data/spec/integration/using_modules_spec.rb +55 -0
- data/spec/integration/value_object_with_custom_constructor_spec.rb +42 -0
- data/spec/integration/virtus/instance_level_attributes_spec.rb +23 -0
- data/spec/integration/virtus/value_object_spec.rb +99 -0
- data/spec/shared/constants_helpers.rb +9 -0
- data/spec/shared/freeze_method_behavior.rb +40 -0
- data/spec/shared/idempotent_method_behaviour.rb +5 -0
- data/spec/shared/options_class_method.rb +19 -0
- data/spec/spec_helper.rb +41 -0
- data/spec/unit/virtus/attribute/boolean/coerce_spec.rb +43 -0
- data/spec/unit/virtus/attribute/boolean/value_coerced_predicate_spec.rb +25 -0
- data/spec/unit/virtus/attribute/class_methods/build_spec.rb +180 -0
- data/spec/unit/virtus/attribute/class_methods/coerce_spec.rb +32 -0
- data/spec/unit/virtus/attribute/coerce_spec.rb +129 -0
- data/spec/unit/virtus/attribute/coercible_predicate_spec.rb +20 -0
- data/spec/unit/virtus/attribute/collection/class_methods/build_spec.rb +105 -0
- data/spec/unit/virtus/attribute/collection/coerce_spec.rb +74 -0
- data/spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb +31 -0
- data/spec/unit/virtus/attribute/comparison_spec.rb +20 -0
- data/spec/unit/virtus/attribute/custom_collection_spec.rb +29 -0
- data/spec/unit/virtus/attribute/defined_spec.rb +20 -0
- data/spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb +70 -0
- data/spec/unit/virtus/attribute/embedded_value/coerce_spec.rb +91 -0
- data/spec/unit/virtus/attribute/get_spec.rb +32 -0
- data/spec/unit/virtus/attribute/hash/class_methods/build_spec.rb +106 -0
- data/spec/unit/virtus/attribute/hash/coerce_spec.rb +92 -0
- data/spec/unit/virtus/attribute/lazy_predicate_spec.rb +20 -0
- data/spec/unit/virtus/attribute/rename_spec.rb +16 -0
- data/spec/unit/virtus/attribute/required_predicate_spec.rb +19 -0
- data/spec/unit/virtus/attribute/set_default_value_spec.rb +107 -0
- data/spec/unit/virtus/attribute/set_spec.rb +29 -0
- data/spec/unit/virtus/attribute/value_coerced_predicate_spec.rb +19 -0
- data/spec/unit/virtus/attribute_set/append_spec.rb +47 -0
- data/spec/unit/virtus/attribute_set/define_reader_method_spec.rb +36 -0
- data/spec/unit/virtus/attribute_set/define_writer_method_spec.rb +36 -0
- data/spec/unit/virtus/attribute_set/each_spec.rb +65 -0
- data/spec/unit/virtus/attribute_set/element_reference_spec.rb +17 -0
- data/spec/unit/virtus/attribute_set/element_set_spec.rb +64 -0
- data/spec/unit/virtus/attribute_set/merge_spec.rb +34 -0
- data/spec/unit/virtus/attribute_set/reset_spec.rb +71 -0
- data/spec/unit/virtus/attribute_spec.rb +229 -0
- data/spec/unit/virtus/attributes_reader_spec.rb +41 -0
- data/spec/unit/virtus/attributes_writer_spec.rb +51 -0
- data/spec/unit/virtus/class_methods/finalize_spec.rb +67 -0
- data/spec/unit/virtus/class_methods/new_spec.rb +39 -0
- data/spec/unit/virtus/config_spec.rb +13 -0
- data/spec/unit/virtus/element_reader_spec.rb +21 -0
- data/spec/unit/virtus/element_writer_spec.rb +19 -0
- data/spec/unit/virtus/freeze_spec.rb +41 -0
- data/spec/unit/virtus/model_spec.rb +197 -0
- data/spec/unit/virtus/module_spec.rb +174 -0
- data/spec/unit/virtus/set_default_attributes_spec.rb +32 -0
- data/spec/unit/virtus/value_object_spec.rb +138 -0
- data/virtus2.gemspec +26 -0
- metadata +225 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
module Virtus
|
2
|
+
class Builder
|
3
|
+
|
4
|
+
# Context used for building "included" and "extended" hooks
|
5
|
+
#
|
6
|
+
# @private
|
7
|
+
class HookContext
|
8
|
+
attr_reader :builder, :config, :attribute_method
|
9
|
+
|
10
|
+
# @api private
|
11
|
+
def initialize(builder, config)
|
12
|
+
@builder, @config = builder, config
|
13
|
+
initialize_attribute_method
|
14
|
+
end
|
15
|
+
|
16
|
+
# @api private
|
17
|
+
def modules
|
18
|
+
modules = builder.extensions
|
19
|
+
modules << Model::Constructor if constructor?
|
20
|
+
modules << Model::MassAssignment if mass_assignment?
|
21
|
+
modules
|
22
|
+
end
|
23
|
+
|
24
|
+
# @api private
|
25
|
+
def constructor?
|
26
|
+
config.constructor
|
27
|
+
end
|
28
|
+
|
29
|
+
# @api private
|
30
|
+
def mass_assignment?
|
31
|
+
config.mass_assignment
|
32
|
+
end
|
33
|
+
|
34
|
+
# @api private
|
35
|
+
def finalize?
|
36
|
+
config.finalize
|
37
|
+
end
|
38
|
+
|
39
|
+
# @api private
|
40
|
+
def initialize_attribute_method
|
41
|
+
method_options = builder.options
|
42
|
+
|
43
|
+
@attribute_method = lambda do |name, type = nil, options = {}|
|
44
|
+
super(name, type, method_options.merge(options))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end # HookContext
|
49
|
+
|
50
|
+
end # Builder
|
51
|
+
end # Virtus
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module Virtus
|
2
|
+
|
3
|
+
# Class to build a Virtus module with it's own config
|
4
|
+
#
|
5
|
+
# This allows for individual Virtus modules to be included in
|
6
|
+
# classes and not impacted by the global Virtus config,
|
7
|
+
# which is implemented using Virtus::config.
|
8
|
+
#
|
9
|
+
# @private
|
10
|
+
class Builder
|
11
|
+
|
12
|
+
# Return module
|
13
|
+
#
|
14
|
+
# @return [Module]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
attr_reader :mod
|
18
|
+
|
19
|
+
# Return config
|
20
|
+
#
|
21
|
+
# @return [config]
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
attr_reader :config
|
25
|
+
|
26
|
+
# @api private
|
27
|
+
def self.call(options, &block)
|
28
|
+
new(Configuration.new(options, &block)).mod
|
29
|
+
end
|
30
|
+
|
31
|
+
# @api private
|
32
|
+
def self.pending
|
33
|
+
@pending ||= []
|
34
|
+
end
|
35
|
+
|
36
|
+
# Initializes a new Builder
|
37
|
+
#
|
38
|
+
# @param [Configuration] config
|
39
|
+
# @param [Module] mod
|
40
|
+
#
|
41
|
+
# @return [undefined]
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
def initialize(conf, mod = Module.new)
|
45
|
+
@config, @mod = conf, mod
|
46
|
+
add_included_hook
|
47
|
+
add_extended_hook
|
48
|
+
end
|
49
|
+
|
50
|
+
# @api private
|
51
|
+
def extensions
|
52
|
+
[Model::Core]
|
53
|
+
end
|
54
|
+
|
55
|
+
# @api private
|
56
|
+
def options
|
57
|
+
config.to_h
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# Adds the .included hook to the anonymous module which then defines the
|
63
|
+
# .attribute method to override the default.
|
64
|
+
#
|
65
|
+
# @return [Module]
|
66
|
+
#
|
67
|
+
# @api private
|
68
|
+
def add_included_hook
|
69
|
+
with_hook_context do |context|
|
70
|
+
mod.define_singleton_method :included do |object|
|
71
|
+
Builder.pending << object unless context.finalize?
|
72
|
+
context.modules.each { |mod| object.send(:include, mod) }
|
73
|
+
object.define_singleton_method(:attribute, context.attribute_method)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# @api private
|
79
|
+
def add_extended_hook
|
80
|
+
with_hook_context do |context|
|
81
|
+
mod.define_singleton_method :extended do |object|
|
82
|
+
context.modules.each { |mod| object.extend(mod) }
|
83
|
+
object.define_singleton_method(:attribute, context.attribute_method)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# @api private
|
89
|
+
def with_hook_context
|
90
|
+
yield(HookContext.new(self, config))
|
91
|
+
end
|
92
|
+
|
93
|
+
end # class Builder
|
94
|
+
|
95
|
+
# @private
|
96
|
+
class ModelBuilder < Builder
|
97
|
+
end # ModelBuilder
|
98
|
+
|
99
|
+
# @private
|
100
|
+
class ModuleBuilder < Builder
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
# @api private
|
105
|
+
def add_included_hook
|
106
|
+
with_hook_context do |context|
|
107
|
+
mod.define_singleton_method :included do |object|
|
108
|
+
super(object)
|
109
|
+
object.extend(ModuleExtensions)
|
110
|
+
ModuleExtensions.setup(object, context.modules)
|
111
|
+
object.define_singleton_method(:attribute, context.attribute_method)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end # ModuleBuilder
|
117
|
+
|
118
|
+
# @private
|
119
|
+
class ValueObjectBuilder < Builder
|
120
|
+
|
121
|
+
# @api private
|
122
|
+
def extensions
|
123
|
+
super << ValueObject::AllowedWriterMethods << ValueObject::InstanceMethods
|
124
|
+
end
|
125
|
+
|
126
|
+
# @api private
|
127
|
+
def options
|
128
|
+
super.merge(:writer => :private)
|
129
|
+
end
|
130
|
+
|
131
|
+
end # ValueObjectBuilder
|
132
|
+
|
133
|
+
end # module Virtus
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Virtus
|
2
|
+
|
3
|
+
# Class-level extensions
|
4
|
+
module ClassInclusions
|
5
|
+
|
6
|
+
# Extends a descendant with class and instance methods
|
7
|
+
#
|
8
|
+
# @param [Class] descendant
|
9
|
+
#
|
10
|
+
# @return [undefined]
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
def self.included(descendant)
|
14
|
+
super
|
15
|
+
descendant.extend(ClassMethods)
|
16
|
+
descendant.class_eval { include Methods }
|
17
|
+
descendant.class_eval { include InstanceMethods }
|
18
|
+
descendant.class_eval { include InstanceMethods::Constructor }
|
19
|
+
descendant.class_eval { include InstanceMethods::MassAssignment }
|
20
|
+
end
|
21
|
+
private_class_method :included
|
22
|
+
|
23
|
+
module Methods
|
24
|
+
|
25
|
+
# Return a list of allowed writer method names
|
26
|
+
#
|
27
|
+
# @return [Set]
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
def allowed_writer_methods
|
31
|
+
self.class.allowed_writer_methods
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# Return class' attribute set
|
37
|
+
#
|
38
|
+
# @return [Virtus::AttributeSet]
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
def attribute_set
|
42
|
+
self.class.attribute_set
|
43
|
+
end
|
44
|
+
|
45
|
+
end # Methods
|
46
|
+
|
47
|
+
end # module ClassInclusions
|
48
|
+
end # module Virtus
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Virtus
|
2
|
+
|
3
|
+
# Class methods that are added when you include Virtus
|
4
|
+
module ClassMethods
|
5
|
+
include Extensions::Methods
|
6
|
+
include ConstMissingExtensions
|
7
|
+
|
8
|
+
# Hook called when module is extended
|
9
|
+
#
|
10
|
+
# @param [Class] descendant
|
11
|
+
#
|
12
|
+
# @return [undefined]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
def self.extended(descendant)
|
16
|
+
super
|
17
|
+
descendant.send(:include, AttributeSet.create(descendant))
|
18
|
+
end
|
19
|
+
private_class_method :extended
|
20
|
+
|
21
|
+
# Returns all the attributes defined on a Class
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
# class User
|
25
|
+
# include Virtus
|
26
|
+
#
|
27
|
+
# attribute :name, String
|
28
|
+
# attribute :age, Integer
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# User.attribute_set # =>
|
32
|
+
#
|
33
|
+
# TODO: implement inspect so the output is not cluttered - solnic
|
34
|
+
#
|
35
|
+
# @return [AttributeSet]
|
36
|
+
#
|
37
|
+
# @api public
|
38
|
+
def attribute_set
|
39
|
+
@attribute_set
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see Virtus::ClassMethods.attribute_set
|
43
|
+
#
|
44
|
+
# @deprecated
|
45
|
+
#
|
46
|
+
# @api public
|
47
|
+
def attributes
|
48
|
+
warn "#{self}.attributes is deprecated. Use #{self}.attribute_set instead: #{caller.first}"
|
49
|
+
attribute_set
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# Setup descendants' own Attribute-accessor-method-hosting modules
|
55
|
+
#
|
56
|
+
# Descendants inherit Attribute accessor methods via Ruby's inheritance
|
57
|
+
# mechanism: Attribute accessor methods are defined in a module included
|
58
|
+
# in a superclass. Attributes defined on descendants add methods to the
|
59
|
+
# descendant's Attributes accessor module, leaving the superclass's method
|
60
|
+
# table unaffected.
|
61
|
+
#
|
62
|
+
# @param [Class] descendant
|
63
|
+
#
|
64
|
+
# @return [undefined]
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
def inherited(descendant)
|
68
|
+
super
|
69
|
+
AttributeSet.create(descendant)
|
70
|
+
descendant.module_eval { include attribute_set }
|
71
|
+
end
|
72
|
+
|
73
|
+
# The list of allowed public methods
|
74
|
+
#
|
75
|
+
# @return [Array<String>]
|
76
|
+
#
|
77
|
+
# @api private
|
78
|
+
def allowed_methods
|
79
|
+
public_instance_methods.map(&:to_s)
|
80
|
+
end
|
81
|
+
|
82
|
+
# @api private
|
83
|
+
def assert_valid_name(name)
|
84
|
+
if instance_methods.include?(:attributes) && name.to_sym == :attributes
|
85
|
+
raise ArgumentError, "#{name.inspect} is not allowed as an attribute name"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end # module ClassMethods
|
90
|
+
end # module Virtus
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Virtus
|
2
|
+
|
3
|
+
# Abstract coercer class
|
4
|
+
#
|
5
|
+
class Coercer
|
6
|
+
include Equalizer.new(inspect) << :primitive << :type
|
7
|
+
|
8
|
+
# @api private
|
9
|
+
attr_reader :primitive, :type
|
10
|
+
|
11
|
+
# @api private
|
12
|
+
def initialize(type)
|
13
|
+
@type = type
|
14
|
+
@primitive = type.primitive
|
15
|
+
end
|
16
|
+
|
17
|
+
# Coerce input value into expected primitive type
|
18
|
+
#
|
19
|
+
# @param [Object] input
|
20
|
+
#
|
21
|
+
# @return [Object] coerced input
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
def call(input)
|
25
|
+
NotImplementedError.new("#{self.class}#call must be implemented")
|
26
|
+
end
|
27
|
+
|
28
|
+
# Return if the input value was successfuly coerced
|
29
|
+
#
|
30
|
+
# @param [Object] input
|
31
|
+
#
|
32
|
+
# @return [Object] coerced input
|
33
|
+
#
|
34
|
+
# @api public
|
35
|
+
def success?(primitive, input)
|
36
|
+
input.kind_of?(primitive)
|
37
|
+
end
|
38
|
+
|
39
|
+
end # Coercer
|
40
|
+
|
41
|
+
end # Virtus
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Virtus
|
2
|
+
|
3
|
+
# A Configuration instance
|
4
|
+
class Configuration
|
5
|
+
|
6
|
+
# Access the finalize setting for this instance
|
7
|
+
attr_accessor :finalize
|
8
|
+
|
9
|
+
# Access the coerce setting for this instance
|
10
|
+
attr_accessor :coerce
|
11
|
+
|
12
|
+
# Access the strict setting for this instance
|
13
|
+
attr_accessor :strict
|
14
|
+
|
15
|
+
# Access the nullify_blank setting for this instance
|
16
|
+
attr_accessor :nullify_blank
|
17
|
+
|
18
|
+
# Access the required setting for this instance
|
19
|
+
attr_accessor :required
|
20
|
+
|
21
|
+
# Access the constructor setting for this instance
|
22
|
+
attr_accessor :constructor
|
23
|
+
|
24
|
+
# Access the mass-assignment setting for this instance
|
25
|
+
attr_accessor :mass_assignment
|
26
|
+
|
27
|
+
# Initialized a configuration instance
|
28
|
+
#
|
29
|
+
# @return [undefined]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
def initialize(options={})
|
33
|
+
@finalize = options.fetch(:finalize, true)
|
34
|
+
@coerce = options.fetch(:coerce, true)
|
35
|
+
@strict = options.fetch(:strict, false)
|
36
|
+
@nullify_blank = options.fetch(:nullify_blank, false)
|
37
|
+
@required = options.fetch(:required, true)
|
38
|
+
@constructor = options.fetch(:constructor, true)
|
39
|
+
@mass_assignment = options.fetch(:mass_assignment, true)
|
40
|
+
@coercer = Coercible::Coercer.new
|
41
|
+
|
42
|
+
yield self if block_given?
|
43
|
+
end
|
44
|
+
|
45
|
+
# Access the coercer for this instance and optional configure a
|
46
|
+
# new coercer with the passed block
|
47
|
+
#
|
48
|
+
# @example
|
49
|
+
# configuration.coercer do |config|
|
50
|
+
# config.string.boolean_map = { true => '1', false => '0' }
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# @return [Coercer]
|
54
|
+
#
|
55
|
+
# @api private
|
56
|
+
def coercer(&block)
|
57
|
+
@coercer = Coercible::Coercer.new(&block) if block_given?
|
58
|
+
@coercer
|
59
|
+
end
|
60
|
+
|
61
|
+
# @api private
|
62
|
+
def to_h
|
63
|
+
{ :coerce => coerce,
|
64
|
+
:finalize => finalize,
|
65
|
+
:strict => strict,
|
66
|
+
:nullify_blank => nullify_blank,
|
67
|
+
:required => required,
|
68
|
+
:configured_coercer => coercer }.freeze
|
69
|
+
end
|
70
|
+
|
71
|
+
end # class Configuration
|
72
|
+
end # module Virtus
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Virtus
|
2
|
+
module ConstMissingExtensions
|
3
|
+
|
4
|
+
# Hooks into const missing process to determine types of attributes
|
5
|
+
#
|
6
|
+
# @param [String] name
|
7
|
+
#
|
8
|
+
# @return [Class]
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
def const_missing(name)
|
12
|
+
Attribute::Builder.determine_type(name) or
|
13
|
+
Axiom::Types.const_defined?(name) && Axiom::Types.const_get(name) or
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|