smart_types 0.1.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -1
  3. data/CHANGELOG.md +57 -0
  4. data/Gemfile.lock +71 -58
  5. data/LICENSE.txt +1 -1
  6. data/README.md +363 -34
  7. data/Rakefile +0 -1
  8. data/bin/console +2 -2
  9. data/lib/smart_core/types/errors.rb +12 -0
  10. data/lib/smart_core/types/primitive/caster.rb +5 -2
  11. data/lib/smart_core/types/primitive/checker.rb +5 -2
  12. data/lib/smart_core/types/primitive/factory/definition_context.rb +140 -4
  13. data/lib/smart_core/types/primitive/factory/runtime_type_builder.rb +53 -0
  14. data/lib/smart_core/types/primitive/factory.rb +104 -7
  15. data/lib/smart_core/types/primitive/invariant_control/chain/result.rb +64 -0
  16. data/lib/smart_core/types/primitive/invariant_control/chain.rb +61 -0
  17. data/lib/smart_core/types/primitive/invariant_control/factory/chain_definition_context.rb +39 -0
  18. data/lib/smart_core/types/primitive/invariant_control/factory.rb +54 -0
  19. data/lib/smart_core/types/primitive/invariant_control/result.rb +104 -0
  20. data/lib/smart_core/types/primitive/invariant_control/single/result.rb +63 -0
  21. data/lib/smart_core/types/primitive/invariant_control/single.rb +57 -0
  22. data/lib/smart_core/types/primitive/invariant_control.rb +67 -0
  23. data/lib/smart_core/types/primitive/mult_factory/definition_context.rb +26 -2
  24. data/lib/smart_core/types/primitive/mult_factory.rb +59 -10
  25. data/lib/smart_core/types/primitive/mult_validator/result.rb +8 -0
  26. data/lib/smart_core/types/primitive/mult_validator.rb +42 -0
  27. data/lib/smart_core/types/primitive/nilable_factory.rb +31 -9
  28. data/lib/smart_core/types/primitive/nilable_validator/result.rb +78 -0
  29. data/lib/smart_core/types/primitive/nilable_validator.rb +83 -0
  30. data/lib/smart_core/types/primitive/runtime_attributes_checker.rb +77 -0
  31. data/lib/smart_core/types/primitive/sum_factory/definition_context.rb +25 -1
  32. data/lib/smart_core/types/primitive/sum_factory.rb +59 -10
  33. data/lib/smart_core/types/primitive/sum_validator/result.rb +100 -0
  34. data/lib/smart_core/types/primitive/sum_validator.rb +117 -0
  35. data/lib/smart_core/types/primitive/undefined_caster.rb +4 -1
  36. data/lib/smart_core/types/primitive/validator/result.rb +78 -0
  37. data/lib/smart_core/types/primitive/validator.rb +93 -0
  38. data/lib/smart_core/types/primitive.rb +99 -15
  39. data/lib/smart_core/types/protocol/instance_of.rb +19 -0
  40. data/lib/smart_core/types/protocol.rb +7 -0
  41. data/lib/smart_core/types/value/array.rb +3 -0
  42. data/lib/smart_core/types/value/big_decimal.rb +4 -1
  43. data/lib/smart_core/types/value/boolean.rb +3 -0
  44. data/lib/smart_core/types/value/class.rb +3 -0
  45. data/lib/smart_core/types/value/date.rb +3 -0
  46. data/lib/smart_core/types/value/date_time.rb +3 -0
  47. data/lib/smart_core/types/value/enumerable.rb +1 -1
  48. data/lib/smart_core/types/value/enumerator.rb +13 -0
  49. data/lib/smart_core/types/value/enumerator_chain.rb +13 -0
  50. data/lib/smart_core/types/value/float.rb +3 -0
  51. data/lib/smart_core/types/value/hash.rb +3 -0
  52. data/lib/smart_core/types/value/integer.rb +3 -0
  53. data/lib/smart_core/types/value/io.rb +13 -0
  54. data/lib/smart_core/types/value/method.rb +9 -0
  55. data/lib/smart_core/types/value/module.rb +3 -0
  56. data/lib/smart_core/types/value/nil.rb +0 -2
  57. data/lib/smart_core/types/value/numeric.rb +3 -0
  58. data/lib/smart_core/types/value/proc.rb +3 -0
  59. data/lib/smart_core/types/value/range.rb +9 -0
  60. data/lib/smart_core/types/value/rational.rb +13 -0
  61. data/lib/smart_core/types/value/set.rb +21 -0
  62. data/lib/smart_core/types/value/string.rb +3 -0
  63. data/lib/smart_core/types/value/string_io.rb +15 -0
  64. data/lib/smart_core/types/value/symbol.rb +3 -0
  65. data/lib/smart_core/types/value/text.rb +6 -4
  66. data/lib/smart_core/types/value/time.rb +3 -0
  67. data/lib/smart_core/types/value/time_based.rb +8 -5
  68. data/lib/smart_core/types/value/unbound_method.rb +9 -0
  69. data/lib/smart_core/types/value.rb +9 -0
  70. data/lib/smart_core/types/variadic/array_of.rb +23 -0
  71. data/lib/smart_core/types/variadic/enum.rb +11 -0
  72. data/lib/smart_core/types/variadic/tuple.rb +23 -0
  73. data/lib/smart_core/types/variadic.rb +10 -0
  74. data/lib/smart_core/types/version.rb +2 -1
  75. data/lib/smart_core/types.rb +2 -0
  76. data/smart_types.gemspec +5 -4
  77. metadata +61 -18
  78. data/.travis.yml +0 -21
  79. data/lib/smart_core/types/primitive/mult_checker.rb +0 -31
  80. data/lib/smart_core/types/primitive/nilable_checker.rb +0 -37
  81. data/lib/smart_core/types/primitive/sum_checker.rb +0 -31
data/Rakefile CHANGED
@@ -4,7 +4,6 @@ require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'rubocop'
6
6
  require 'rubocop/rake_task'
7
- require 'rubocop-rails'
8
7
  require 'rubocop-performance'
9
8
  require 'rubocop-rspec'
10
9
  require 'rubocop-rake'
data/bin/console CHANGED
@@ -4,5 +4,5 @@
4
4
  require 'bundler/setup'
5
5
  require 'smart_core/types'
6
6
 
7
- require 'irb'
8
- IRB.start(__FILE__)
7
+ require 'pry'
8
+ Pry.start
@@ -13,6 +13,18 @@ module SmartCore::Types
13
13
  # @since 0.1.0
14
14
  NameError = Class.new(SmartCore::NameError)
15
15
 
16
+ # @api public
17
+ # @since 0.3.0
18
+ TypeDefinitionError = Class.new(ArgumentError)
19
+
20
+ # @api public
21
+ # @since 0.3.0
22
+ IncorrectRuntimeAttributesError = Class.new(TypeDefinitionError)
23
+
24
+ # @api public
25
+ # @since 0.3.0
26
+ RuntimeAttriburtesUnsupportedError = Class.new(TypeDefinitionError)
27
+
16
28
  # @api public
17
29
  # @since 0.1.0
18
30
  TypeError = Class.new(SmartCore::TypeError)
@@ -2,6 +2,7 @@
2
2
 
3
3
  # @api private
4
4
  # @since 0.1.0
5
+ # @version 0.3.0
5
6
  class SmartCore::Types::Primitive::Caster
6
7
  # @param expression [Proc]
7
8
  # @return [void]
@@ -13,12 +14,14 @@ class SmartCore::Types::Primitive::Caster
13
14
  end
14
15
 
15
16
  # @param value [Any]
17
+ # @param runtime_attributes [Array<Any>]
16
18
  # @return [Any]
17
19
  #
18
20
  # @api private
19
21
  # @since 0.1.0
20
- def call(value)
21
- expression.call(value)
22
+ # @version 0.3.0
23
+ def call(value, runtime_attributes)
24
+ expression.call(value, runtime_attributes)
22
25
  end
23
26
 
24
27
  private
@@ -2,6 +2,7 @@
2
2
 
3
3
  # @api private
4
4
  # @since 0.1.0
5
+ # @version 0.3.0
5
6
  class SmartCore::Types::Primitive::Checker
6
7
  # @param expression [Proc]
7
8
  # @return [void]
@@ -13,12 +14,14 @@ class SmartCore::Types::Primitive::Checker
13
14
  end
14
15
 
15
16
  # @param value [Any]
17
+ # @param runtime_attributes [Array<Any>]
16
18
  # @return [Boolean]
17
19
  #
18
20
  # @api private
19
21
  # @since 0.1.0
20
- def call(value)
21
- !!expression.call(value)
22
+ # @version 0.3.0
23
+ def call(value, runtime_attributes)
24
+ !!expression.call(value, runtime_attributes)
22
25
  end
23
26
 
24
27
  private
@@ -2,7 +2,59 @@
2
2
 
3
3
  # @api private
4
4
  # @since 0.1.0
5
+ # @version 0.3.0
5
6
  class SmartCore::Types::Primitive::Factory::DefinitionContext
7
+ class << self
8
+ # @param name [String, Symbol]
9
+ # @param definition [Block]
10
+ # @return [void]
11
+ #
12
+ # @api private
13
+ # @since 0.2.0
14
+ # @version 0.3.0
15
+ def vaildate_invariant_attributes!(name, &definition)
16
+ unless block_given?
17
+ raise(SmartCore::Types::TypeDefinitionError, 'No invariant block')
18
+ end
19
+
20
+ unless name.is_a?(::String) || name.is_a?(::Symbol)
21
+ raise(SmartCore::Types::TypeDefinitionError, <<~ERROR_MESSAGE)
22
+ Invariant name should be a type of string or symbol.
23
+ ERROR_MESSAGE
24
+ end
25
+
26
+ if name == '' || name == :""
27
+ raise(SmartCore::Types::TypeDefinitionError, <<~ERROR_MESSAGE)
28
+ Invariant name can not be empty.
29
+ ERROR_MESSAGE
30
+ end
31
+ end
32
+
33
+ # @param chain_name [String, Symbol]
34
+ # @param definition [Block]
35
+ # @return [void]
36
+ #
37
+ # @api private
38
+ # @since 0.3.0
39
+ def vaildate_invariant_chain_attributes!(chain_name, &definition)
40
+ unless block_given?
41
+ raise(SmartCore::Types::TypeDefinitionError, 'No invariant chain block')
42
+ end
43
+
44
+ unless chain_name.is_a?(::String) || chain_name.is_a?(::Symbol)
45
+ raise(SmartCore::Types::TypeDefinitionError, <<~ERROR_MESSAGE)
46
+ Invariant chain name should be a type of string or symbol.
47
+ ERROR_MESSAGE
48
+ end
49
+
50
+ if chain_name == '' || chain_name == :""
51
+ raise(SmartCore::Types::TypeDefinitionError, <<~ERROR_MESSAGE)
52
+ Invariant chain name can not be empty.
53
+ ERROR_MESSAGE
54
+ end
55
+ end
56
+ end
57
+
6
58
  # @return [Proc, NilClass]
7
59
  #
8
60
  # @api private
@@ -15,13 +67,36 @@ class SmartCore::Types::Primitive::Factory::DefinitionContext
15
67
  # @since 0.1.0
16
68
  attr_reader :type_caster
17
69
 
70
+ # @return [Hash<String,Array<Proc>>]
71
+ #
72
+ # @api private
73
+ # @since 0.2.0
74
+ attr_reader :type_invariant_chains
75
+
76
+ # @return [Hash<String,Proc>]
77
+ #
78
+ # @api private
79
+ # @since 0.2.0
80
+ attr_reader :type_invariants
81
+
82
+ # @return [Proc, NilClass]
83
+ #
84
+ # @api private
85
+ # @since 0.3.0
86
+ attr_reader :type_runtime_attributes_checker
87
+
18
88
  # @return [void]
19
89
  #
20
90
  # @api private
21
91
  # @since 0.1.0
92
+ # @version 0.2.0
22
93
  def initialize
94
+ @type_invariant_chains = Hash.new { |h, k| h[k] = [] }
95
+ @type_invariants = {}
23
96
  @type_checker = nil
24
97
  @type_caster = nil
98
+ @type_runtime_attributes_checker = nil
99
+ @definition_lock = SmartCore::Engine::Lock.new
25
100
  end
26
101
 
27
102
  # @param checker [Block]
@@ -29,9 +104,14 @@ class SmartCore::Types::Primitive::Factory::DefinitionContext
29
104
  #
30
105
  # @api public
31
106
  # @since 0.1.0
107
+ # @version 0.3.0
32
108
  def define_checker(&checker)
33
- raise(SmartCore::ArgumentError, 'No checker definition block') unless block_given?
34
- @type_checker = checker
109
+ thread_safe do
110
+ unless block_given?
111
+ raise(SmartCore::Types::TypeDefinitionError, 'No checker definition block')
112
+ end
113
+ @type_checker = checker
114
+ end
35
115
  end
36
116
 
37
117
  # @param caster [Block]
@@ -39,8 +119,64 @@ class SmartCore::Types::Primitive::Factory::DefinitionContext
39
119
  #
40
120
  # @api public
41
121
  # @since 0.1.0
122
+ # @version 0.3.0
42
123
  def define_caster(&caster)
43
- raise(SmartCore::ArgumentError, 'No caster definition block') unless block_given?
44
- @type_caster = caster
124
+ thread_safe do
125
+ unless block_given?
126
+ raise(SmartCore::Types::TypeDefinitionError, 'No caster definition block')
127
+ end
128
+ @type_caster = caster
129
+ end
130
+ end
131
+
132
+ # @param chain_name [String, Symbol]
133
+ # @param definitions [Block]
134
+ # @return [void]
135
+ #
136
+ # @api public
137
+ # @since 0.2.0
138
+ def invariant_chain(chain_name, &definitions)
139
+ thread_safe do
140
+ self.class.vaildate_invariant_chain_attributes!(chain_name, &definitions)
141
+ @type_invariant_chains[chain_name.to_s] << definitions
142
+ end
143
+ end
144
+
145
+ # @param name [String, Symbol]
146
+ # @param definition [Block]
147
+ # @return [void]
148
+ #
149
+ # @api public
150
+ # @since 0.2.0
151
+ def invariant(name, &definition)
152
+ thread_safe do
153
+ self.class.vaildate_invariant_attributes!(name, &definition)
154
+ @type_invariants[name.to_s] = definition
155
+ end
156
+ end
157
+
158
+ # @param definition [Block]
159
+ # @return [void]
160
+ #
161
+ # @api public
162
+ # @since 0.3.0
163
+ def runtime_attributes_checker(&definition)
164
+ thread_safe do
165
+ unless block_given?
166
+ raise(SmartCore::Types::TypeDefinitionError, 'No runtime checker definition block')
167
+ end
168
+ @type_runtime_attributes_checker = definition
169
+ end
170
+ end
171
+
172
+ private
173
+
174
+ # @param block [Block]
175
+ # @return [Any]
176
+ #
177
+ # @api private
178
+ # @since 0.2.0
179
+ def thread_safe(&block)
180
+ @definition_lock.synchronize(&block)
45
181
  end
46
182
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.3.0
5
+ module SmartCore::Types::Primitive::Factory::RuntimeTypeBuilder
6
+ class << self
7
+ # @param type_name [String, Symbol]
8
+ # @param type_category [Class<SmartCore::Types::Primitive>]
9
+ # @param runtime_attributes [Array<Any>]
10
+ # @return [SmartCore::Types::Primitive]
11
+ #
12
+ # @api private
13
+ # @since 0.3.0
14
+ def build_with_runtime(type_name, type_category, runtime_attributes)
15
+ type = type_category.const_get(type_name)
16
+ type.runtime_attributes_checker.check!(runtime_attributes)
17
+
18
+ type.clone.tap do |type_with_custom_runtime|
19
+ type_with_custom_runtime.instance_variable_set(
20
+ :@runtime_attributes, runtime_attributes.freeze
21
+ )
22
+ end
23
+ end
24
+
25
+ # @param new_instance [SmartCore::Types::Primitive]
26
+ # @param cloneable_instance [SmartCore::Types::Primitive]
27
+ # @return [void]
28
+ #
29
+ # @api private
30
+ # @since 0.3.0
31
+ # rubocop:disable Metrics/AbcSize, Layout/LineLength
32
+ def initialize_clone(new_instance, cloneable_instance)
33
+ name_clone = cloneable_instance.instance_variable_get(:@name)
34
+ category_clone = cloneable_instance.instance_variable_get(:@category)
35
+ validator_clone = cloneable_instance.instance_variable_get(:@validator).___copy_for___(new_instance)
36
+ caster_clone = cloneable_instance.instance_variable_get(:@caster)
37
+ runtime_attributes_clone = cloneable_instance.instance_variable_get(:@runtime_attributes).clone
38
+ runtime_attributes_checker_clone = cloneable_instance.instance_variable_get(:@runtime_attributes_checker).___copy_for___(new_instance)
39
+ lock_clone = SmartCore::Engine::Lock.new
40
+ nilable_clone = nil
41
+
42
+ new_instance.instance_variable_set(:@name, name_clone)
43
+ new_instance.instance_variable_set(:@category, category_clone)
44
+ new_instance.instance_variable_set(:@validator, validator_clone)
45
+ new_instance.instance_variable_set(:@caster, caster_clone)
46
+ new_instance.instance_variable_set(:@runtime_attributes, runtime_attributes_clone)
47
+ new_instance.instance_variable_set(:@runtime_attributes_checker, runtime_attributes_checker_clone)
48
+ new_instance.instance_variable_set(:@lock_clone, lock_clone)
49
+ new_instance.instance_variable_set(:@nilable, nilable_clone)
50
+ end
51
+ # rubocop:enable Metrics/AbcSize, Layout/LineLength
52
+ end
53
+ end
@@ -2,8 +2,10 @@
2
2
 
3
3
  # @api private
4
4
  # @since 0.1.0
5
+ # @version 0.3.0
5
6
  class SmartCore::Types::Primitive::Factory
6
7
  require_relative 'factory/definition_context'
8
+ require_relative 'factory/runtime_type_builder'
7
9
 
8
10
  class << self
9
11
  # @param type_category [Class<SmartCore::Types::Primitive>]
@@ -13,12 +15,26 @@ class SmartCore::Types::Primitive::Factory
13
15
  #
14
16
  # @api private
15
17
  # @since 0.1.0
18
+ # @version 0.3.0
16
19
  def create_type(type_category, type_name, type_definition)
17
20
  type_definitions = build_type_definitions(type_definition)
21
+ type_runtime_attributes_checker = build_type_runtime_attributes_checker(type_definitions)
18
22
  type_checker = build_type_checker(type_definitions)
19
23
  type_caster = build_type_caster(type_definitions)
20
- type = build_type(type_category, type_name, type_checker, type_caster)
21
- type.tap { register_new_type(type_category, type_name, type) }
24
+ type_invariant_control = build_type_invariant_control(type_definitions)
25
+ type_validator = build_type_validator(type_checker, type_invariant_control)
26
+ build_type(
27
+ type_category,
28
+ type_name,
29
+ type_validator,
30
+ type_caster,
31
+ type_runtime_attributes_checker
32
+ ).tap do |type|
33
+ assign_type_validator(type, type_validator)
34
+ assign_type_runtime_attributes_checker(type, type_runtime_attributes_checker)
35
+ register_new_type(type_category, type_name, type)
36
+ register_runtime_type_builder(type_category, type_name)
37
+ end
22
38
  end
23
39
 
24
40
  private
@@ -38,10 +54,33 @@ class SmartCore::Types::Primitive::Factory
38
54
  raise(
39
55
  SmartCore::Types::NoCheckerDefinitionError,
40
56
  'Type checker is not provided. You should define it via .define_checker(&block)'
41
- ) if context.type_checker.nil?
57
+ ) if context.type_checker == nil
42
58
  end
43
59
  end
44
60
 
61
+ # @param type_definitions [SmartCore::Types::Primitive::Factory::DefinitionContext]
62
+ # @return [SmartCore::Types::Primitive::RuntimeAttributesChecker]
63
+ #
64
+ # @api private
65
+ # @since 0.3.0
66
+ def build_type_runtime_attributes_checker(type_definitions)
67
+ SmartCore::Types::Primitive::RuntimeAttributesChecker.new(
68
+ type_definitions.type_runtime_attributes_checker
69
+ )
70
+ end
71
+
72
+ # @param type_definitions [SmartCore::Types::Primitive::Factory::DefinitionContext]
73
+ # @return [SmartCore::Types::Primitive::InvariantControl]
74
+ #
75
+ # @api private
76
+ # @since 0.2.0
77
+ def build_type_invariant_control(type_definitions)
78
+ SmartCore::Types::Primitive::InvariantControl.create(
79
+ type_definitions.type_invariant_chains,
80
+ type_definitions.type_invariants
81
+ )
82
+ end
83
+
45
84
  # @param type_definitions [SmartCore::Types::Primitive::Factory::DefinitionContext]
46
85
  # @return [SmartCore::Types::Primitive::Checker]
47
86
  #
@@ -57,23 +96,67 @@ class SmartCore::Types::Primitive::Factory
57
96
  # @api private
58
97
  # @since 0.1.0
59
98
  def build_type_caster(type_definitions)
60
- if type_definitions.type_caster.nil?
99
+ if type_definitions.type_caster == nil
61
100
  SmartCore::Types::Primitive::UndefinedCaster.new
62
101
  else
63
102
  SmartCore::Types::Primitive::Caster.new(type_definitions.type_caster)
64
103
  end
65
104
  end
66
105
 
106
+ # @param checker [SmartCore::Types::Primitive::Checker]
107
+ # @param invariant_control [SmartCore::Types::Primitive::InvariantControl]
108
+ # @return [void]
109
+ #
110
+ # @api private
111
+ # @since 0.2.0
112
+ def build_type_validator(type_checker, type_invariant_control)
113
+ SmartCore::Types::Primitive::Validator.new(type_checker, type_invariant_control)
114
+ end
115
+
67
116
  # @param type_klass [Class<SmartCore::Types::Primitive>]
68
117
  # @param type_name [String, Symbol]
69
- # @param type_checker [SmartCore::Types::Primitive::Checker]
118
+ # @param type_validator [SmartCore::Types::Primitive::Validator]
70
119
  # @param type_caster [SmartCore::Types::Primitive::Caster]
120
+ # @param type_runtime_attributes_checker [SmartCore::Types::Primitive::RuntimeAttributesChecker]
71
121
  # @return [SmartCore::Types::Primitive]
72
122
  #
73
123
  # @api private
74
124
  # @since 0.1.0
75
- def build_type(type_category, type_name, type_checker, type_caster)
76
- Class.new(type_category).new(type_checker, type_caster)
125
+ # @version 0.3.0
126
+ def build_type(
127
+ type_category,
128
+ type_name,
129
+ type_validator,
130
+ type_caster,
131
+ type_runtime_attributes_checker
132
+ )
133
+ Class.new(type_category).new(
134
+ type_name,
135
+ type_category,
136
+ type_validator,
137
+ type_caster,
138
+ type_runtime_attributes_checker
139
+ )
140
+ end
141
+
142
+ # @param type [SmartCore::Types::Primitive]
143
+ # @param type_validator [SmartCore::Types::Primitive::Validator]
144
+ # @return [void]
145
+ #
146
+ # @api private
147
+ # @since 0.2.0
148
+ def assign_type_validator(type, type_validator)
149
+ type_validator.___assign_type___(type)
150
+ end
151
+
152
+ # @param type [SmartCore::Types::Primitive]
153
+ # @param type_runtime_attributes_checker [SmartCore::Types::Primitive::RuntimeAttributesChecker]
154
+ # @return [void]
155
+ #
156
+ # @api private
157
+ # @since 0.3.0
158
+ def assign_type_runtime_attributes_checker(type, type_runtime_attributes_checker)
159
+ type_runtime_attributes_checker.___assign_type___(type)
77
160
  end
78
161
 
79
162
  # @param type_category [Class<SmartCore::Types::Primitive>]
@@ -93,5 +176,19 @@ class SmartCore::Types::Primitive::Factory
93
176
  "Incorrect constant name for new type (#{type_name})"
94
177
  )
95
178
  end
179
+
180
+ # @param type_category [Class<SmartCore::Types::Primitive>]
181
+ # @param type_name [String, Symbol]
182
+ # @return [void]
183
+ #
184
+ # @raise [SmartCore::Types::IncorrectTypeNameError]
185
+ #
186
+ # @api private
187
+ # @since 0.3.0
188
+ def register_runtime_type_builder(type_category, type_name)
189
+ type_category.define_singleton_method(type_name) do |*runtime_attributes|
190
+ RuntimeTypeBuilder.build_with_runtime(type_name, type_category, runtime_attributes)
191
+ end
192
+ end
96
193
  end
97
194
  end