smart_initializer 0.1.0.alpha4 → 0.1.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 +3 -0
- data/Gemfile.lock +48 -31
- data/README.md +151 -22
- data/Rakefile +1 -1
- data/bin/rspec +54 -0
- data/gemfiles/with_external_deps.gemfile +7 -0
- data/gemfiles/with_external_deps.gemfile.lock +99 -0
- data/gemfiles/without_external_deps.gemfile +5 -0
- data/gemfiles/without_external_deps.gemfile.lock +97 -0
- data/lib/smart_core/initializer.rb +38 -35
- data/lib/smart_core/initializer/attribute.rb +12 -4
- 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/configurable_module.rb +27 -0
- data/lib/smart_core/initializer/configuration.rb +33 -0
- data/lib/smart_core/initializer/constructor.rb +9 -6
- data/lib/smart_core/initializer/constructor/definer.rb +34 -11
- data/lib/smart_core/initializer/dsl.rb +23 -6
- data/lib/smart_core/initializer/errors.rb +44 -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 +1 -1
- data/smart_initializer.gemspec +13 -9
- metadata +67 -17
- data/lib/smart_core/initializer/attribute/init_extension.rb +0 -4
- 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,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
module SmartCore::Initializer::ConfigurableModule
|
6
|
+
# @return [NilClass]
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
# @since 0.1.0
|
10
|
+
INITIAL_TYPE_SYSTEM = nil
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# @param type_system [String, Symbol, NilClass]
|
14
|
+
# @return [Module]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
# @since 0.1.0
|
18
|
+
def build(type_system: INITIAL_TYPE_SYSTEM)
|
19
|
+
Module.new.tap do |extension|
|
20
|
+
extension.singleton_class.define_method(:included) do |base_klass|
|
21
|
+
base_klass.include(::SmartCore::Initializer)
|
22
|
+
base_klass.__initializer_settings__.type_system = type_system
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
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
|
@@ -107,10 +107,10 @@ class SmartCore::Initializer::Constructor
|
|
107
107
|
parameter_definitions = Hash[klass.__params__.zip(parameters)]
|
108
108
|
|
109
109
|
parameter_definitions.each_pair do |attribute, parameter_value|
|
110
|
-
|
110
|
+
if !attribute.type.valid?(parameter_value) && attribute.cast?
|
111
|
+
parameter_value = attribute.type.cast(parameter_value)
|
112
|
+
end
|
111
113
|
|
112
|
-
# TODO: fail with SmartCore::Initializer::ArgumentError
|
113
|
-
# (isntead of SmartCore::Types::TypeError)
|
114
114
|
attribute.type.validate!(parameter_value)
|
115
115
|
|
116
116
|
final_value = attribute.finalizer.call(parameter_value, instance)
|
@@ -123,19 +123,22 @@ class SmartCore::Initializer::Constructor
|
|
123
123
|
#
|
124
124
|
# @api private
|
125
125
|
# @since 0.1.0
|
126
|
+
# rubocop:disable Metrics/AbcSize
|
126
127
|
def initialize_options(instance)
|
127
128
|
klass.__options__.each do |attribute|
|
128
129
|
option_value = options.fetch(attribute.name) { attribute.default }
|
129
|
-
option_value = attribute.type.cast(option_value) if attribute.cast?
|
130
130
|
|
131
|
-
|
132
|
-
|
131
|
+
if !attribute.type.valid?(option_value) && attribute.cast?
|
132
|
+
option_value = attribute.type.cast(option_value)
|
133
|
+
end
|
134
|
+
|
133
135
|
attribute.type.validate!(option_value)
|
134
136
|
|
135
137
|
final_value = attribute.finalizer.call(option_value, instance)
|
136
138
|
instance.instance_variable_set("@#{attribute.name}", final_value)
|
137
139
|
end
|
138
140
|
end
|
141
|
+
# rubocop:enable Metrics/AbcSize
|
139
142
|
|
140
143
|
# @param instance [Any]
|
141
144
|
# @return [void]
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.1.0
|
5
|
+
# rubocop:disable Metrics/ClassLength
|
5
6
|
class SmartCore::Initializer::Constructor::Definer
|
6
7
|
# @param klass [Class]
|
7
8
|
# @return [void]
|
@@ -25,7 +26,8 @@ class SmartCore::Initializer::Constructor::Definer
|
|
25
26
|
end
|
26
27
|
|
27
28
|
# @param name [String, Symbol]
|
28
|
-
# @param type [String, Symbol,
|
29
|
+
# @param type [String, Symbol, Any]
|
30
|
+
# @param type_system [String, Symbol]
|
29
31
|
# @param privacy [String, Symbol]
|
30
32
|
# @param finalize [String, Symbol, Proc]
|
31
33
|
# @param cast [Boolean]
|
@@ -34,9 +36,17 @@ class SmartCore::Initializer::Constructor::Definer
|
|
34
36
|
#
|
35
37
|
# @api private
|
36
38
|
# @since 0.1.0
|
37
|
-
def define_parameter(name, type, privacy, finalize, cast, dynamic_options)
|
39
|
+
def define_parameter(name, type, type_system, privacy, finalize, cast, dynamic_options)
|
38
40
|
thread_safe do
|
39
|
-
attribute = build_attribute(
|
41
|
+
attribute = build_attribute(
|
42
|
+
name,
|
43
|
+
type,
|
44
|
+
type_system,
|
45
|
+
privacy,
|
46
|
+
finalize,
|
47
|
+
cast,
|
48
|
+
dynamic_options
|
49
|
+
)
|
40
50
|
prevent_option_overlap(attribute)
|
41
51
|
add_parameter(attribute)
|
42
52
|
end
|
@@ -52,7 +62,8 @@ class SmartCore::Initializer::Constructor::Definer
|
|
52
62
|
names.map do |name|
|
53
63
|
build_attribute(
|
54
64
|
name,
|
55
|
-
|
65
|
+
klass.__initializer_settings__.generic_type_object,
|
66
|
+
klass.__initializer_settings__.type_system,
|
56
67
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
57
68
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
58
69
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
@@ -67,7 +78,8 @@ class SmartCore::Initializer::Constructor::Definer
|
|
67
78
|
end
|
68
79
|
|
69
80
|
# @param name [String, Symbol]
|
70
|
-
# @param type [String, Symbol,
|
81
|
+
# @param type [String, Symbol, Any]
|
82
|
+
# @param type_system [String, Symbol]
|
71
83
|
# @param privacy [String, Symbol]
|
72
84
|
# @param finalize [String, Symbol, Proc]
|
73
85
|
# @param cast [Boolean]
|
@@ -76,9 +88,17 @@ class SmartCore::Initializer::Constructor::Definer
|
|
76
88
|
#
|
77
89
|
# @api private
|
78
90
|
# @since 0.1.0
|
79
|
-
def define_option(name, type, privacy, finalize, cast, dynamic_options)
|
91
|
+
def define_option(name, type, type_system, privacy, finalize, cast, dynamic_options)
|
80
92
|
thread_safe do
|
81
|
-
attribute = build_attribute(
|
93
|
+
attribute = build_attribute(
|
94
|
+
name,
|
95
|
+
type,
|
96
|
+
type_system,
|
97
|
+
privacy,
|
98
|
+
finalize,
|
99
|
+
cast,
|
100
|
+
dynamic_options
|
101
|
+
)
|
82
102
|
prevent_parameter_overlap(attribute)
|
83
103
|
add_option(attribute)
|
84
104
|
end
|
@@ -94,7 +114,8 @@ class SmartCore::Initializer::Constructor::Definer
|
|
94
114
|
names.map do |name|
|
95
115
|
build_attribute(
|
96
116
|
name,
|
97
|
-
|
117
|
+
klass.__initializer_settings__.generic_type_object,
|
118
|
+
klass.__initializer_settings__.type_system,
|
98
119
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
99
120
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
100
121
|
SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
@@ -117,7 +138,8 @@ class SmartCore::Initializer::Constructor::Definer
|
|
117
138
|
attr_reader :klass
|
118
139
|
|
119
140
|
# @param name [String, Symbol]
|
120
|
-
# @param type [String, Symbol,
|
141
|
+
# @param type [String, Symbol, Any]
|
142
|
+
# @param type_system [String, Symbol]
|
121
143
|
# @param privacy [String, Symbol]
|
122
144
|
# @param finalize [String, Symbol, Proc]
|
123
145
|
# @param cast [Boolean]
|
@@ -126,9 +148,9 @@ class SmartCore::Initializer::Constructor::Definer
|
|
126
148
|
#
|
127
149
|
# @api private
|
128
150
|
# @since 0.1.0
|
129
|
-
def build_attribute(name, type, privacy, finalize, cast, dynamic_options)
|
151
|
+
def build_attribute(name, type, type_system, privacy, finalize, cast, dynamic_options)
|
130
152
|
SmartCore::Initializer::Attribute::Factory.create(
|
131
|
-
name, type, privacy, finalize, cast, dynamic_options
|
153
|
+
name, type, type_system, privacy, finalize, cast, dynamic_options
|
132
154
|
)
|
133
155
|
end
|
134
156
|
|
@@ -207,3 +229,4 @@ class SmartCore::Initializer::Constructor::Definer
|
|
207
229
|
@lock.synchronize(&block)
|
208
230
|
end
|
209
231
|
end
|
232
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -18,6 +18,7 @@ module SmartCore::Initializer::DSL
|
|
18
18
|
instance_variable_set(:@__init_extensions__, SmartCore::Initializer::Extensions::List.new)
|
19
19
|
instance_variable_set(:@__definer__, SmartCore::Initializer::Constructor::Definer.new(self))
|
20
20
|
instance_variable_set(:@__deflock__, SmartCore::Engine::Lock.new)
|
21
|
+
instance_variable_set(:@__initializer_settings__, SmartCore::Initializer::Settings.new)
|
21
22
|
end
|
22
23
|
base_klass.extend(ClassMethods)
|
23
24
|
base_klass.singleton_class.prepend(ClassInheritance)
|
@@ -39,6 +40,7 @@ module SmartCore::Initializer::DSL
|
|
39
40
|
instance_variable_set(:@__init_extensions__, SmartCore::Initializer::Extensions::List.new)
|
40
41
|
instance_variable_set(:@__definer__, SmartCore::Initializer::Constructor::Definer.new(self))
|
41
42
|
instance_variable_set(:@__deflock__, SmartCore::Engine::Lock.new)
|
43
|
+
instance_variable_set(:@__initializer_settings__, __initializer_settings__.dup)
|
42
44
|
end
|
43
45
|
child_klass.extend(ClassMethods)
|
44
46
|
SmartCore::Initializer::DSL::Inheritance.inherit(base: self, child: child_klass)
|
@@ -81,6 +83,14 @@ module SmartCore::Initializer::DSL
|
|
81
83
|
@__definer__
|
82
84
|
end
|
83
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
|
+
|
84
94
|
# @param arguments [Array]
|
85
95
|
# @param block [Block]
|
86
96
|
# @return [Any]
|
@@ -92,7 +102,7 @@ module SmartCore::Initializer::DSL
|
|
92
102
|
end
|
93
103
|
|
94
104
|
# @param name [String, Symbol]
|
95
|
-
# @param type [String, Symbol,
|
105
|
+
# @param type [String, Symbol, Any]
|
96
106
|
# @option cast [Boolean]
|
97
107
|
# @option privacy [String, Symbol]
|
98
108
|
# @option finalize [String, Symbol, Proc]
|
@@ -103,13 +113,16 @@ module SmartCore::Initializer::DSL
|
|
103
113
|
# @since 0.1.0
|
104
114
|
def param(
|
105
115
|
name,
|
106
|
-
type =
|
116
|
+
type = __initializer_settings__.generic_type_object,
|
107
117
|
privacy: SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
108
118
|
finalize: SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
109
119
|
cast: SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
120
|
+
type_system: __initializer_settings__.type_system,
|
110
121
|
**dynamic_options
|
111
122
|
)
|
112
|
-
__definer__.define_parameter(
|
123
|
+
__definer__.define_parameter(
|
124
|
+
name, type, type_system, privacy, finalize, cast, dynamic_options
|
125
|
+
)
|
113
126
|
end
|
114
127
|
|
115
128
|
# @param names [Array<String, Symbol>]
|
@@ -122,10 +135,11 @@ module SmartCore::Initializer::DSL
|
|
122
135
|
end
|
123
136
|
|
124
137
|
# @param name [String, Symbol]
|
125
|
-
# @param type [String, Symbol,
|
138
|
+
# @param type [String, Symbol, Any]
|
126
139
|
# @option cast [Boolean]
|
127
140
|
# @option privacy [String, Symbol]
|
128
141
|
# @option finalize [String, Symbol, Proc]
|
142
|
+
# @option type_system [String, Symbol]
|
129
143
|
# @param dynamic_options [Hash<Symbol,Any>]
|
130
144
|
# @return [void]
|
131
145
|
#
|
@@ -133,13 +147,16 @@ module SmartCore::Initializer::DSL
|
|
133
147
|
# @since 0.1.0
|
134
148
|
def option(
|
135
149
|
name,
|
136
|
-
type =
|
150
|
+
type = __initializer_settings__.generic_type_object,
|
137
151
|
privacy: SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
|
138
152
|
finalize: SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
|
139
153
|
cast: SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
|
154
|
+
type_system: __initializer_settings__.type_system,
|
140
155
|
**dynamic_options
|
141
156
|
)
|
142
|
-
__definer__.define_option(
|
157
|
+
__definer__.define_option(
|
158
|
+
name, type, type_system, privacy, finalize, cast, dynamic_options
|
159
|
+
)
|
143
160
|
end
|
144
161
|
|
145
162
|
# @param names [Array<String, Symbol>]
|
@@ -32,4 +32,48 @@ module SmartCore::Initializer
|
|
32
32
|
# @api public
|
33
33
|
# @since 0.1.0
|
34
34
|
NoTypeAliasError = Class.new(Error)
|
35
|
+
|
36
|
+
# @api public
|
37
|
+
# @since 0.1.0
|
38
|
+
PluginError = Class.new(Error)
|
39
|
+
|
40
|
+
# @api public
|
41
|
+
# @since 0.1.0
|
42
|
+
UnresolvedPluginDependencyError = Class.new(PluginError)
|
43
|
+
|
44
|
+
# @api public
|
45
|
+
# @since 0.1.0
|
46
|
+
AlreadyRegisteredPluginError = Class.new(PluginError)
|
47
|
+
|
48
|
+
# @api public
|
49
|
+
# @since 0.1.0
|
50
|
+
UnregisteredPluginError = Class.new(PluginError)
|
51
|
+
|
52
|
+
# @api public
|
53
|
+
# @since 0.1.0
|
54
|
+
TypeSystemError = Class.new(Error)
|
55
|
+
|
56
|
+
# @api public
|
57
|
+
# @since 0.1.0
|
58
|
+
TypeAliasNotFoundError = Class.new(TypeSystemError)
|
59
|
+
|
60
|
+
# @api public
|
61
|
+
# @since 0.1.0
|
62
|
+
IncorrectTypeSystemInteropError = Class.new(TypeSystemError)
|
63
|
+
|
64
|
+
# @api public
|
65
|
+
# @since 0.1.0
|
66
|
+
IncorrectTypeObjectError = Class.new(TypeSystemError)
|
67
|
+
|
68
|
+
# @api public
|
69
|
+
# @since 0.1.0
|
70
|
+
UnsupportedTypeSystemError = Class.new(TypeSystemError)
|
71
|
+
|
72
|
+
# @api public
|
73
|
+
# @since 0.1.0
|
74
|
+
UnsupportedTypeOperationError = Class.new(TypeSystemError)
|
75
|
+
|
76
|
+
# @api public
|
77
|
+
# @since 0.1.0
|
78
|
+
TypeCastingUnsupportedError = Class.new(UnsupportedTypeOperationError)
|
35
79
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
module SmartCore::Initializer::Plugins
|
6
|
+
require_relative 'plugins/abstract'
|
7
|
+
require_relative 'plugins/registry'
|
8
|
+
require_relative 'plugins/registry_interface.rb'
|
9
|
+
require_relative 'plugins/access_mixin'
|
10
|
+
require_relative 'plugins/thy_types'
|
11
|
+
|
12
|
+
# @since 0.1.0
|
13
|
+
extend SmartCore::Initializer::Plugins::RegistryInterface
|
14
|
+
|
15
|
+
# @since 0.1.0
|
16
|
+
register_plugin('thy_types', SmartCore::Initializer::Plugins::ThyTypes)
|
17
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.1.0
|
5
|
+
class SmartCore::Initializer::Plugins::Abstract
|
6
|
+
class << self
|
7
|
+
# @param child_klass [Class]
|
8
|
+
# @return [void]
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
# @since 0.1.0
|
12
|
+
def inherited(child_klass)
|
13
|
+
child_klass.instance_variable_set(:@__loaded__, false)
|
14
|
+
child_klass.instance_variable_set(:@__lock__, Mutex.new)
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [void]
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
# @since 0.1.0
|
22
|
+
def load!
|
23
|
+
__thread_safe__ do
|
24
|
+
unless @__loaded__
|
25
|
+
@__loaded__ = true
|
26
|
+
install!
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return [Boolean]
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
# @since 0.1.0
|
35
|
+
def loaded?
|
36
|
+
__thread_safe__ { @__loaded__ }
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# @return [void]
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
# @since 0.1.0
|
45
|
+
def install!; end
|
46
|
+
|
47
|
+
# @return [Any]
|
48
|
+
#
|
49
|
+
# @api private
|
50
|
+
# @since 0.1.0
|
51
|
+
def __thread_safe__
|
52
|
+
@__lock__.synchronize { yield }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|