smart_initializer 0.1.0.alpha2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|