smart_initializer 0.1.0.alpha2 → 0.3.0
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 +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +36 -5
- data/CHANGELOG.md +15 -0
- data/Gemfile.lock +63 -43
- data/README.md +263 -11
- data/Rakefile +1 -1
- data/bin/rspec +54 -0
- data/gemfiles/with_external_deps.gemfile +7 -0
- data/gemfiles/with_external_deps.gemfile.lock +102 -0
- data/gemfiles/without_external_deps.gemfile +5 -0
- data/gemfiles/without_external_deps.gemfile.lock +100 -0
- data/lib/smart_core/initializer.rb +44 -28
- data/lib/smart_core/initializer/attribute.rb +12 -5
- data/lib/smart_core/initializer/attribute/factory.rb +47 -27
- data/lib/smart_core/initializer/attribute/parameters.rb +12 -4
- data/lib/smart_core/initializer/configuration.rb +33 -0
- data/lib/smart_core/initializer/constructor.rb +60 -23
- data/lib/smart_core/initializer/{attribute → constructor}/definer.rb +64 -12
- data/lib/smart_core/initializer/dsl.rb +47 -10
- data/lib/smart_core/initializer/dsl/inheritance.rb +1 -0
- data/lib/smart_core/initializer/errors.rb +44 -0
- data/lib/smart_core/initializer/extensions.rb +9 -0
- data/lib/smart_core/initializer/extensions/abstract.rb +8 -0
- data/lib/smart_core/initializer/extensions/ext_init.rb +31 -0
- data/lib/smart_core/initializer/extensions/list.rb +74 -0
- data/lib/smart_core/initializer/functionality.rb +36 -0
- data/lib/smart_core/initializer/instance_attribute_accessing.rb +51 -0
- data/lib/smart_core/initializer/plugins.rb +17 -0
- data/lib/smart_core/initializer/plugins/abstract.rb +55 -0
- data/lib/smart_core/initializer/plugins/access_mixin.rb +47 -0
- data/lib/smart_core/initializer/plugins/registry.rb +166 -0
- data/lib/smart_core/initializer/plugins/registry_interface.rb +77 -0
- data/lib/smart_core/initializer/plugins/thy_types.rb +30 -0
- data/lib/smart_core/initializer/plugins/thy_types/errors.rb +11 -0
- data/lib/smart_core/initializer/plugins/thy_types/thy_types.rb +23 -0
- data/lib/smart_core/initializer/plugins/thy_types/thy_types/abstract_factory.rb +78 -0
- data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation.rb +12 -0
- data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/base.rb +9 -0
- data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/cast.rb +21 -0
- data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/valid.rb +16 -0
- data/lib/smart_core/initializer/plugins/thy_types/thy_types/operation/validate.rb +19 -0
- data/lib/smart_core/initializer/settings.rb +49 -0
- data/lib/smart_core/initializer/settings/duplicator.rb +20 -0
- data/lib/smart_core/initializer/settings/type_system.rb +69 -0
- data/lib/smart_core/initializer/type_system.rb +16 -0
- data/lib/smart_core/initializer/type_system/interop.rb +103 -0
- data/lib/smart_core/initializer/type_system/interop/abstract_factory.rb +70 -0
- data/lib/smart_core/initializer/type_system/interop/aliasing.rb +72 -0
- data/lib/smart_core/initializer/type_system/interop/aliasing/alias_list.rb +141 -0
- data/lib/smart_core/initializer/type_system/interop/operation.rb +30 -0
- data/lib/smart_core/initializer/type_system/registry.rb +174 -0
- data/lib/smart_core/initializer/type_system/registry_interface.rb +102 -0
- data/lib/smart_core/initializer/type_system/smart_types.rb +48 -0
- data/lib/smart_core/initializer/type_system/smart_types/abstract_factory.rb +72 -0
- data/lib/smart_core/initializer/type_system/smart_types/operation.rb +13 -0
- data/lib/smart_core/initializer/type_system/smart_types/operation/base.rb +8 -0
- data/lib/smart_core/initializer/type_system/smart_types/operation/cast.rb +16 -0
- data/lib/smart_core/initializer/type_system/smart_types/operation/valid.rb +16 -0
- data/lib/smart_core/initializer/type_system/smart_types/operation/validate.rb +16 -0
- data/lib/smart_core/initializer/version.rb +2 -1
- data/smart_initializer.gemspec +13 -9
- metadata +73 -17
- data/lib/smart_core/initializer/type_aliasing.rb +0 -50
- data/lib/smart_core/initializer/type_aliasing/alias_list.rb +0 -101
@@ -43,12 +43,18 @@ class SmartCore::Initializer::Attribute::Parameters
|
|
43
43
|
# @since 0.1.0
|
44
44
|
attr_reader :name
|
45
45
|
|
46
|
-
# @return [SmartCore::
|
46
|
+
# @return [SmartCore::Initializer::TypeSystem::Interop]
|
47
47
|
#
|
48
48
|
# @api private
|
49
49
|
# @since 0.1.0
|
50
50
|
attr_reader :type
|
51
51
|
|
52
|
+
# @return [Class<SmartCore::Initilizer::TypeSystem::Interop>]
|
53
|
+
#
|
54
|
+
# @api private
|
55
|
+
# @since 0.1.0
|
56
|
+
attr_reader :type_system
|
57
|
+
|
52
58
|
# @return [Symbol]
|
53
59
|
#
|
54
60
|
# @api private
|
@@ -76,7 +82,8 @@ class SmartCore::Initializer::Attribute::Parameters
|
|
76
82
|
attr_reader :dynamic_options
|
77
83
|
|
78
84
|
# @param name [Symbol]
|
79
|
-
# @param type [SmartCore::
|
85
|
+
# @param type [SmartCore::Initializer::TypeSystem::Interop]
|
86
|
+
# @param type_system [Class<SmartCore::Initializer::TypeSystem::Interop>]
|
80
87
|
# @param privacy [Symbol]
|
81
88
|
# @param finalizer [SmartCore::Initializer::Attribute::AnonymousBlock/InstanceMethod]
|
82
89
|
# @param cast [Boolean]
|
@@ -86,9 +93,10 @@ class SmartCore::Initializer::Attribute::Parameters
|
|
86
93
|
#
|
87
94
|
# @api private
|
88
95
|
# @since 0.1.0
|
89
|
-
def initialize(name, type, privacy, finalizer, cast, dynamic_options)
|
96
|
+
def initialize(name, type, type_system, privacy, finalizer, cast, dynamic_options)
|
90
97
|
@name = name
|
91
98
|
@type = type
|
99
|
+
@type_system = type_system
|
92
100
|
@privacy = privacy
|
93
101
|
@finalizer = finalizer
|
94
102
|
@cast = cast
|
@@ -116,6 +124,6 @@ class SmartCore::Initializer::Attribute::Parameters
|
|
116
124
|
ERROR_MESSAGE
|
117
125
|
end
|
118
126
|
|
119
|
-
|
127
|
+
default_value.is_a?(Proc) ? default_value.call : default_value
|
120
128
|
end
|
121
129
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'qonfig'
|
4
|
+
|
5
|
+
# @api public
|
6
|
+
# @since 0.1.0
|
7
|
+
module SmartCore::Initializer::Configuration
|
8
|
+
# @since 0.1.0
|
9
|
+
include Qonfig::Configurable
|
10
|
+
|
11
|
+
# @api public
|
12
|
+
# @since 0.1.0
|
13
|
+
extend SmartCore::Initializer::Plugins::AccessMixin
|
14
|
+
|
15
|
+
class << self
|
16
|
+
# @param setting_key [String, Symbol]
|
17
|
+
# @return [Qonfig::Settings, Any]
|
18
|
+
#
|
19
|
+
# @api private
|
20
|
+
# @since 0.1.0
|
21
|
+
def [](setting_key)
|
22
|
+
config[setting_key]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @since 0.1.0
|
27
|
+
configuration do
|
28
|
+
setting :default_type_system, :smart_types
|
29
|
+
validate :default_type_system do |value|
|
30
|
+
SmartCore::Initializer::TypeSystem.resolve(value) rescue false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -3,6 +3,8 @@
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
5
|
class SmartCore::Initializer::Constructor
|
6
|
+
require_relative 'constructor/definer'
|
7
|
+
|
6
8
|
# @param klass [Class<SmartCore::Initializer>]
|
7
9
|
# @param arguments [Array<Any>]
|
8
10
|
# @param block [Proc, NilClass]
|
@@ -13,8 +15,8 @@ class SmartCore::Initializer::Constructor
|
|
13
15
|
def initialize(klass, arguments, block)
|
14
16
|
@klass = klass
|
15
17
|
@arguments = arguments
|
16
|
-
@
|
17
|
-
@
|
18
|
+
@parameters, @options = extract_attributes(arguments)
|
19
|
+
@block = block
|
18
20
|
end
|
19
21
|
|
20
22
|
# @return [Any]
|
@@ -26,6 +28,8 @@ class SmartCore::Initializer::Constructor
|
|
26
28
|
prevent_attribute_insufficiency
|
27
29
|
initialize_parameters(instance)
|
28
30
|
initialize_options(instance)
|
31
|
+
process_original_initializer(instance)
|
32
|
+
process_init_extensions(instance)
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
@@ -47,19 +51,19 @@ class SmartCore::Initializer::Constructor
|
|
47
51
|
#
|
48
52
|
# @api private
|
49
53
|
# @since 0.1.0
|
50
|
-
attr_reader :
|
54
|
+
attr_reader :parameters
|
51
55
|
|
52
56
|
# @return [Hash<Symbol,Any>]
|
53
57
|
#
|
54
58
|
# @api private
|
55
59
|
# @since 0.1.0
|
56
|
-
attr_reader :
|
60
|
+
attr_reader :options
|
57
61
|
|
58
62
|
# @return [Proc, NilClass]
|
59
63
|
#
|
60
64
|
# @api private
|
61
65
|
# @since 0.1.0
|
62
|
-
attr_reader :
|
66
|
+
attr_reader :block
|
63
67
|
|
64
68
|
# @return [void]
|
65
69
|
#
|
@@ -68,23 +72,33 @@ class SmartCore::Initializer::Constructor
|
|
68
72
|
#
|
69
73
|
# @api private
|
70
74
|
# @since 0.1.0
|
75
|
+
# rubocop:disable Metrics/AbcSize
|
71
76
|
def prevent_attribute_insufficiency
|
72
|
-
required_options = klass.__options__.reject(&:has_default?).map(&:name)
|
73
77
|
required_parameter_count = klass.__params__.size
|
74
78
|
|
75
79
|
raise(
|
76
80
|
SmartCore::Initializer::ParameterArgumentError,
|
77
81
|
"Wrong number of parameters " \
|
78
|
-
"(given #{
|
79
|
-
) unless
|
82
|
+
"(given #{parameters.size}, expected #{required_parameter_count})"
|
83
|
+
) unless parameters.size == required_parameter_count
|
80
84
|
|
81
|
-
|
85
|
+
required_options = klass.__options__.reject(&:has_default?).map(&:name)
|
86
|
+
missing_options = required_options.reject { |option| options.key?(option) }
|
82
87
|
|
83
88
|
raise(
|
84
89
|
SmartCore::Initializer::OptionArgumentError,
|
85
90
|
"Missing options: #{missing_options.join(', ')}"
|
86
91
|
) if missing_options.any?
|
92
|
+
|
93
|
+
possible_options = klass.__options__.map(&:name)
|
94
|
+
unknown_options = options.keys - possible_options
|
95
|
+
|
96
|
+
raise(
|
97
|
+
SmartCore::Initializer::OptionArgumentError,
|
98
|
+
"Unknown options: #{unknown_options.join(', ')}"
|
99
|
+
) if unknown_options.any?
|
87
100
|
end
|
101
|
+
# rubocop:enable Metrics/AbcSize
|
88
102
|
|
89
103
|
# @return [Any]
|
90
104
|
#
|
@@ -100,13 +114,13 @@ class SmartCore::Initializer::Constructor
|
|
100
114
|
# @api private
|
101
115
|
# @since 0.1.0
|
102
116
|
def initialize_parameters(instance)
|
103
|
-
parameter_definitions = Hash[klass.__params__.zip(
|
117
|
+
parameter_definitions = Hash[klass.__params__.zip(parameters)]
|
104
118
|
|
105
119
|
parameter_definitions.each_pair do |attribute, parameter_value|
|
106
|
-
|
120
|
+
if !attribute.type.valid?(parameter_value) && attribute.cast?
|
121
|
+
parameter_value = attribute.type.cast(parameter_value)
|
122
|
+
end
|
107
123
|
|
108
|
-
# TODO: fail with SmartCore::Initializer::ArgumentError
|
109
|
-
# (isntead of SmartCore::Types::TypeError)
|
110
124
|
attribute.type.validate!(parameter_value)
|
111
125
|
|
112
126
|
final_value = attribute.finalizer.call(parameter_value, instance)
|
@@ -119,19 +133,42 @@ class SmartCore::Initializer::Constructor
|
|
119
133
|
#
|
120
134
|
# @api private
|
121
135
|
# @since 0.1.0
|
136
|
+
# rubocop:disable Metrics/AbcSize
|
122
137
|
def initialize_options(instance)
|
123
138
|
klass.__options__.each do |attribute|
|
124
|
-
option_value =
|
125
|
-
|
139
|
+
option_value = options.fetch(attribute.name) { attribute.default }
|
140
|
+
|
141
|
+
if !attribute.type.valid?(option_value) && attribute.cast?
|
142
|
+
option_value = attribute.type.cast(option_value)
|
143
|
+
end
|
126
144
|
|
127
|
-
# TODO: fail with SmartCore::Initializer::ArgumentError
|
128
|
-
# (isntead of SmartCore::Types::TypeError)
|
129
145
|
attribute.type.validate!(option_value)
|
130
146
|
|
131
147
|
final_value = attribute.finalizer.call(option_value, instance)
|
132
148
|
instance.instance_variable_set("@#{attribute.name}", final_value)
|
133
149
|
end
|
134
150
|
end
|
151
|
+
# rubocop:enable Metrics/AbcSize
|
152
|
+
|
153
|
+
# @param instance [Any]
|
154
|
+
# @return [void]
|
155
|
+
#
|
156
|
+
# @api private
|
157
|
+
# @since 0.1.0
|
158
|
+
def process_original_initializer(instance)
|
159
|
+
instance.send(:initialize, *arguments, &block)
|
160
|
+
end
|
161
|
+
|
162
|
+
# @param instance [Any]
|
163
|
+
# @return [void]
|
164
|
+
#
|
165
|
+
# @api private
|
166
|
+
# @since 0.1.0
|
167
|
+
def process_init_extensions(instance)
|
168
|
+
klass.__init_extensions__.each do |extension|
|
169
|
+
extension.call(instance)
|
170
|
+
end
|
171
|
+
end
|
135
172
|
|
136
173
|
# @param arguments [Array<Any>]
|
137
174
|
# @return [Array<Array<Any>,Hash<Symbol,Any>>]
|
@@ -139,20 +176,20 @@ class SmartCore::Initializer::Constructor
|
|
139
176
|
# @api private
|
140
177
|
# @since 0.1.0
|
141
178
|
def extract_attributes(arguments)
|
142
|
-
|
143
|
-
|
179
|
+
extracted_parameters = []
|
180
|
+
extracted_options = {}
|
144
181
|
|
145
182
|
if (
|
146
183
|
klass.__options__.size >= 1 &&
|
147
184
|
arguments.last.is_a?(Hash) &&
|
148
185
|
arguments.last.keys.all? { |key| key.is_a?(Symbol) }
|
149
186
|
)
|
150
|
-
|
151
|
-
|
187
|
+
extracted_parameters = arguments[0..-2]
|
188
|
+
extracted_options = arguments.last
|
152
189
|
else
|
153
|
-
|
190
|
+
extracted_parameters = arguments
|
154
191
|
end
|
155
192
|
|
156
|
-
[
|
193
|
+
[extracted_parameters, extracted_options]
|
157
194
|
end
|
158
195
|
end
|
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
|
-
|
5
|
+
# rubocop:disable Metrics/ClassLength
|
6
|
+
class SmartCore::Initializer::Constructor::Definer
|
6
7
|
# @param klass [Class]
|
7
8
|
# @return [void]
|
8
9
|
#
|
@@ -13,8 +14,20 @@ class SmartCore::Initializer::Attribute::Definer
|
|
13
14
|
@lock = SmartCore::Engine::Lock.new
|
14
15
|
end
|
15
16
|
|
17
|
+
# @param block [Proc]
|
18
|
+
# @return [void]
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
# @since 0.1.0
|
22
|
+
def define_init_extension(block)
|
23
|
+
thread_safe do
|
24
|
+
add_init_extension(build_init_extension(block))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
16
28
|
# @param name [String, Symbol]
|
17
|
-
# @param type [String, Symbol,
|
29
|
+
# @param type [String, Symbol, Any]
|
30
|
+
# @param type_system [String, Symbol]
|
18
31
|
# @param privacy [String, Symbol]
|
19
32
|
# @param finalize [String, Symbol, Proc]
|
20
33
|
# @param cast [Boolean]
|
@@ -23,9 +36,17 @@ class SmartCore::Initializer::Attribute::Definer
|
|
23
36
|
#
|
24
37
|
# @api private
|
25
38
|
# @since 0.1.0
|
26
|
-
def define_parameter(name, type, privacy, finalize, cast, dynamic_options)
|
39
|
+
def define_parameter(name, type, type_system, privacy, finalize, cast, dynamic_options)
|
27
40
|
thread_safe do
|
28
|
-
attribute = build_attribute(
|
41
|
+
attribute = build_attribute(
|
42
|
+
name,
|
43
|
+
type,
|
44
|
+
type_system,
|
45
|
+
privacy,
|
46
|
+
finalize,
|
47
|
+
cast,
|
48
|
+
dynamic_options
|
49
|
+
)
|
29
50
|
prevent_option_overlap(attribute)
|
30
51
|
add_parameter(attribute)
|
31
52
|
end
|
@@ -41,7 +62,8 @@ class SmartCore::Initializer::Attribute::Definer
|
|
41
62
|
names.map do |name|
|
42
63
|
build_attribute(
|
43
64
|
name,
|
44
|
-
|
65
|
+
klass.__initializer_settings__.generic_type_object,
|
66
|
+
klass.__initializer_settings__.type_system,
|
45
67
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
46
68
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
47
69
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
@@ -56,7 +78,8 @@ class SmartCore::Initializer::Attribute::Definer
|
|
56
78
|
end
|
57
79
|
|
58
80
|
# @param name [String, Symbol]
|
59
|
-
# @param type [String, Symbol,
|
81
|
+
# @param type [String, Symbol, Any]
|
82
|
+
# @param type_system [String, Symbol]
|
60
83
|
# @param privacy [String, Symbol]
|
61
84
|
# @param finalize [String, Symbol, Proc]
|
62
85
|
# @param cast [Boolean]
|
@@ -65,9 +88,17 @@ class SmartCore::Initializer::Attribute::Definer
|
|
65
88
|
#
|
66
89
|
# @api private
|
67
90
|
# @since 0.1.0
|
68
|
-
def define_option(name, type, privacy, finalize, cast, dynamic_options)
|
91
|
+
def define_option(name, type, type_system, privacy, finalize, cast, dynamic_options)
|
69
92
|
thread_safe do
|
70
|
-
attribute = build_attribute(
|
93
|
+
attribute = build_attribute(
|
94
|
+
name,
|
95
|
+
type,
|
96
|
+
type_system,
|
97
|
+
privacy,
|
98
|
+
finalize,
|
99
|
+
cast,
|
100
|
+
dynamic_options
|
101
|
+
)
|
71
102
|
prevent_parameter_overlap(attribute)
|
72
103
|
add_option(attribute)
|
73
104
|
end
|
@@ -83,7 +114,8 @@ class SmartCore::Initializer::Attribute::Definer
|
|
83
114
|
names.map do |name|
|
84
115
|
build_attribute(
|
85
116
|
name,
|
86
|
-
|
117
|
+
klass.__initializer_settings__.generic_type_object,
|
118
|
+
klass.__initializer_settings__.type_system,
|
87
119
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
88
120
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
89
121
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
@@ -106,7 +138,8 @@ class SmartCore::Initializer::Attribute::Definer
|
|
106
138
|
attr_reader :klass
|
107
139
|
|
108
140
|
# @param name [String, Symbol]
|
109
|
-
# @param type [String, Symbol,
|
141
|
+
# @param type [String, Symbol, Any]
|
142
|
+
# @param type_system [String, Symbol]
|
110
143
|
# @param privacy [String, Symbol]
|
111
144
|
# @param finalize [String, Symbol, Proc]
|
112
145
|
# @param cast [Boolean]
|
@@ -115,12 +148,21 @@ class SmartCore::Initializer::Attribute::Definer
|
|
115
148
|
#
|
116
149
|
# @api private
|
117
150
|
# @since 0.1.0
|
118
|
-
def build_attribute(name, type, privacy, finalize, cast, dynamic_options)
|
151
|
+
def build_attribute(name, type, type_system, privacy, finalize, cast, dynamic_options)
|
119
152
|
SmartCore::Initializer::Attribute::Factory.create(
|
120
|
-
name, type, privacy, finalize, cast, dynamic_options
|
153
|
+
name, type, type_system, privacy, finalize, cast, dynamic_options
|
121
154
|
)
|
122
155
|
end
|
123
156
|
|
157
|
+
# @param block [Proc]
|
158
|
+
# @return [SmartCore::Initializer::Extensions::ExtInit]
|
159
|
+
#
|
160
|
+
# @api private
|
161
|
+
# @since 0.1.0
|
162
|
+
def build_init_extension(block)
|
163
|
+
SmartCore::Initializer::Extensions::ExtInit.new(block)
|
164
|
+
end
|
165
|
+
|
124
166
|
# @param parameter [SmartCore::Initializer::Attribute]
|
125
167
|
# @return [void]
|
126
168
|
#
|
@@ -143,6 +185,15 @@ class SmartCore::Initializer::Attribute::Definer
|
|
143
185
|
klass.send(option.privacy, option.name)
|
144
186
|
end
|
145
187
|
|
188
|
+
# @param extension [SmartCore::Initializer::Extensions::ExtInit]
|
189
|
+
# @return [void]
|
190
|
+
#
|
191
|
+
# @api private
|
192
|
+
# @since 0.1.0
|
193
|
+
def add_init_extension(extension)
|
194
|
+
klass.__init_extensions__ << extension
|
195
|
+
end
|
196
|
+
|
146
197
|
# @param parameter [SmartCore::Initializer::Attribute]
|
147
198
|
# @return [void]
|
148
199
|
#
|
@@ -178,3 +229,4 @@ class SmartCore::Initializer::Attribute::Definer
|
|
178
229
|
@lock.synchronize(&block)
|
179
230
|
end
|
180
231
|
end
|
232
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -13,10 +13,12 @@ module SmartCore::Initializer::DSL
|
|
13
13
|
# @since 0.1.0
|
14
14
|
def extended(base_klass)
|
15
15
|
base_klass.instance_eval do
|
16
|
-
instance_variable_set(:@__params__,
|
16
|
+
instance_variable_set(:@__params__, SmartCore::Initializer::Attribute::List.new)
|
17
17
|
instance_variable_set(:@__options__, SmartCore::Initializer::Attribute::List.new)
|
18
|
-
instance_variable_set(:@
|
18
|
+
instance_variable_set(:@__init_extensions__, SmartCore::Initializer::Extensions::List.new)
|
19
|
+
instance_variable_set(:@__definer__, SmartCore::Initializer::Constructor::Definer.new(self))
|
19
20
|
instance_variable_set(:@__deflock__, SmartCore::Engine::Lock.new)
|
21
|
+
instance_variable_set(:@__initializer_settings__, SmartCore::Initializer::Settings.new)
|
20
22
|
end
|
21
23
|
base_klass.extend(ClassMethods)
|
22
24
|
base_klass.singleton_class.prepend(ClassInheritance)
|
@@ -33,10 +35,12 @@ module SmartCore::Initializer::DSL
|
|
33
35
|
# @since 0.1.0
|
34
36
|
def inherited(child_klass)
|
35
37
|
child_klass.instance_eval do
|
36
|
-
instance_variable_set(:@__params__,
|
38
|
+
instance_variable_set(:@__params__, SmartCore::Initializer::Attribute::List.new)
|
37
39
|
instance_variable_set(:@__options__, SmartCore::Initializer::Attribute::List.new)
|
38
|
-
instance_variable_set(:@
|
40
|
+
instance_variable_set(:@__init_extensions__, SmartCore::Initializer::Extensions::List.new)
|
41
|
+
instance_variable_set(:@__definer__, SmartCore::Initializer::Constructor::Definer.new(self))
|
39
42
|
instance_variable_set(:@__deflock__, SmartCore::Engine::Lock.new)
|
43
|
+
instance_variable_set(:@__initializer_settings__, __initializer_settings__.dup)
|
40
44
|
end
|
41
45
|
child_klass.extend(ClassMethods)
|
42
46
|
SmartCore::Initializer::DSL::Inheritance.inherit(base: self, child: child_klass)
|
@@ -63,6 +67,14 @@ module SmartCore::Initializer::DSL
|
|
63
67
|
@__options__
|
64
68
|
end
|
65
69
|
|
70
|
+
# @return [SmartCore::Initializer::Extentions::List]
|
71
|
+
#
|
72
|
+
# @api private
|
73
|
+
# @since 0.1.0
|
74
|
+
def __init_extensions__
|
75
|
+
@__init_extensions__
|
76
|
+
end
|
77
|
+
|
66
78
|
# @return [SmartCore::Initializer::Attribute::Definer]
|
67
79
|
#
|
68
80
|
# @api private
|
@@ -71,6 +83,14 @@ module SmartCore::Initializer::DSL
|
|
71
83
|
@__definer__
|
72
84
|
end
|
73
85
|
|
86
|
+
# @return [SmartCore::Initializer::Settings]
|
87
|
+
#
|
88
|
+
# @api private
|
89
|
+
# @since 0.1.0
|
90
|
+
def __initializer_settings__
|
91
|
+
@__initializer_settings__
|
92
|
+
end
|
93
|
+
|
74
94
|
# @param arguments [Array]
|
75
95
|
# @param block [Block]
|
76
96
|
# @return [Any]
|
@@ -82,7 +102,7 @@ module SmartCore::Initializer::DSL
|
|
82
102
|
end
|
83
103
|
|
84
104
|
# @param name [String, Symbol]
|
85
|
-
# @param type [String, Symbol,
|
105
|
+
# @param type [String, Symbol, Any]
|
86
106
|
# @option cast [Boolean]
|
87
107
|
# @option privacy [String, Symbol]
|
88
108
|
# @option finalize [String, Symbol, Proc]
|
@@ -93,13 +113,16 @@ module SmartCore::Initializer::DSL
|
|
93
113
|
# @since 0.1.0
|
94
114
|
def param(
|
95
115
|
name,
|
96
|
-
type =
|
116
|
+
type = __initializer_settings__.generic_type_object,
|
97
117
|
privacy: SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
98
118
|
finalize: SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
99
119
|
cast: SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
120
|
+
type_system: __initializer_settings__.type_system,
|
100
121
|
**dynamic_options
|
101
122
|
)
|
102
|
-
__definer__.define_parameter(
|
123
|
+
__definer__.define_parameter(
|
124
|
+
name, type, type_system, privacy, finalize, cast, dynamic_options
|
125
|
+
)
|
103
126
|
end
|
104
127
|
|
105
128
|
# @param names [Array<String, Symbol>]
|
@@ -112,10 +135,11 @@ module SmartCore::Initializer::DSL
|
|
112
135
|
end
|
113
136
|
|
114
137
|
# @param name [String, Symbol]
|
115
|
-
# @param type [String, Symbol,
|
138
|
+
# @param type [String, Symbol, Any]
|
116
139
|
# @option cast [Boolean]
|
117
140
|
# @option privacy [String, Symbol]
|
118
141
|
# @option finalize [String, Symbol, Proc]
|
142
|
+
# @option type_system [String, Symbol]
|
119
143
|
# @param dynamic_options [Hash<Symbol,Any>]
|
120
144
|
# @return [void]
|
121
145
|
#
|
@@ -123,13 +147,16 @@ module SmartCore::Initializer::DSL
|
|
123
147
|
# @since 0.1.0
|
124
148
|
def option(
|
125
149
|
name,
|
126
|
-
type =
|
150
|
+
type = __initializer_settings__.generic_type_object,
|
127
151
|
privacy: SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
128
152
|
finalize: SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
129
153
|
cast: SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
154
|
+
type_system: __initializer_settings__.type_system,
|
130
155
|
**dynamic_options
|
131
156
|
)
|
132
|
-
__definer__.define_option(
|
157
|
+
__definer__.define_option(
|
158
|
+
name, type, type_system, privacy, finalize, cast, dynamic_options
|
159
|
+
)
|
133
160
|
end
|
134
161
|
|
135
162
|
# @param names [Array<String, Symbol>]
|
@@ -140,5 +167,15 @@ module SmartCore::Initializer::DSL
|
|
140
167
|
def options(*names)
|
141
168
|
__definer__.define_options(*names)
|
142
169
|
end
|
170
|
+
|
171
|
+
# @param block [Block]
|
172
|
+
# @return [void]
|
173
|
+
#
|
174
|
+
# @api public
|
175
|
+
# @since 0.1.0
|
176
|
+
def ext_init(&block)
|
177
|
+
__definer__.define_init_extension(block)
|
178
|
+
end
|
179
|
+
alias_method :extend_initialization_flow, :ext_init
|
143
180
|
end
|
144
181
|
end
|