smart_injection 0.0.0.alpha3 → 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d6f87bba0170853c09fc72fd200054365cc4653d76bf7c3e2347af9d5c8a3e59
4
- data.tar.gz: 9f09cbfca987d5a0423f8ff0100d4c1a2732b1f9051ec689fa8106dc5bde2678
3
+ metadata.gz: 1f48169147897c8ce8f66b9f89612932e7f4928dfbd841a71333952e36fa2d8e
4
+ data.tar.gz: d8516b07187415d826c6370f3b03c7200c3c8df59cc04cba455aa815beda0f1e
5
5
  SHA512:
6
- metadata.gz: de681417379858196fad5b211b065e226c1744c20472d592b479697ff82a309ba111b9a460c5b4484ca81499c486848bfa445567c95ba32100b0d1112def7cd1
7
- data.tar.gz: 15d6cfd72927a2d46c9d71465b1650666cb81f5bc112d1abb3710ff4f397718b49debb4a1c821259e118ffeb09d34b8173c1b4e4359d4342018ed46db20f3f27
6
+ metadata.gz: 6258aebce545dafba8aaef29d7f137f322e097c60d7003d2dfd3bdc8d111845493f52909918c71bc233abc54c5c5c3b55dd7fd4b83d753f238bdf6a92c8c3704
7
+ data.tar.gz: 3f27d11d72af45e20fd2fbf393765be6414a2bb5e91b9dff4a797c13870fd36752702cc03cb9fd7e13acbea3632b2712e967ddf6e6bab6ef22c24e52bd70fad3
data/Gemfile.lock CHANGED
@@ -1,41 +1,34 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_injection (0.0.0.alpha2)
5
- smart_container (~> 0.8, >= 0.8.1)
6
- smart_engine (~> 0.7)
4
+ smart_injection (0.0.0)
7
5
 
8
6
  GEM
9
7
  remote: https://rubygems.org/
10
8
  specs:
11
- activesupport (6.0.3.2)
9
+ activesupport (6.0.3.1)
12
10
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
11
  i18n (>= 0.7, < 2)
14
12
  minitest (~> 5.1)
15
13
  tzinfo (~> 1.1)
16
14
  zeitwerk (~> 2.2, >= 2.2.2)
17
- armitage-rubocop (0.85.1)
18
- rubocop (= 0.85.1)
15
+ armitage-rubocop (0.85.0)
16
+ rubocop (= 0.85.0)
19
17
  rubocop-performance (= 1.6.1)
20
- rubocop-rails (= 2.6.0)
18
+ rubocop-rails (= 2.5.2)
21
19
  rubocop-rake (= 0.5.1)
22
- rubocop-rspec (= 1.40.0)
20
+ rubocop-rspec (= 1.39.0)
23
21
  ast (2.4.1)
24
- coderay (1.1.3)
25
22
  concurrent-ruby (1.1.6)
26
- diff-lcs (1.4.4)
23
+ diff-lcs (1.3)
27
24
  docile (1.3.2)
28
25
  i18n (1.8.3)
29
26
  concurrent-ruby (~> 1.0)
30
- method_source (1.0.0)
31
27
  minitest (5.14.1)
32
- parallel (1.19.2)
33
- parser (2.7.1.4)
34
- ast (~> 2.4.1)
35
- pry (0.13.1)
36
- coderay (~> 1.1)
37
- method_source (~> 1.0)
38
- rack (2.2.3)
28
+ parallel (1.19.1)
29
+ parser (2.7.1.3)
30
+ ast (~> 2.4.0)
31
+ rack (2.2.2)
39
32
  rainbow (3.0.0)
40
33
  rake (13.0.1)
41
34
  regexp_parser (1.7.1)
@@ -53,7 +46,7 @@ GEM
53
46
  diff-lcs (>= 1.2.0, < 2.0)
54
47
  rspec-support (~> 3.9.0)
55
48
  rspec-support (3.9.3)
56
- rubocop (0.85.1)
49
+ rubocop (0.85.0)
57
50
  parallel (~> 1.10)
58
51
  parser (>= 2.7.0.1)
59
52
  rainbow (>= 2.2.2, < 4.0)
@@ -62,31 +55,28 @@ GEM
62
55
  rubocop-ast (>= 0.0.3)
63
56
  ruby-progressbar (~> 1.7)
64
57
  unicode-display_width (>= 1.4.0, < 2.0)
65
- rubocop-ast (0.1.0)
58
+ rubocop-ast (0.0.3)
66
59
  parser (>= 2.7.0.1)
67
60
  rubocop-performance (1.6.1)
68
61
  rubocop (>= 0.71.0)
69
- rubocop-rails (2.6.0)
70
- activesupport (>= 4.2.0)
62
+ rubocop-rails (2.5.2)
63
+ activesupport
71
64
  rack (>= 1.1)
72
- rubocop (>= 0.82.0)
65
+ rubocop (>= 0.72.0)
73
66
  rubocop-rake (0.5.1)
74
67
  rubocop
75
- rubocop-rspec (1.40.0)
68
+ rubocop-rspec (1.39.0)
76
69
  rubocop (>= 0.68.1)
77
70
  ruby-progressbar (1.10.1)
78
71
  simplecov (0.18.5)
79
72
  docile (~> 1.1)
80
73
  simplecov-html (~> 0.11)
81
74
  simplecov-html (0.12.2)
82
- smart_container (0.8.1)
83
- smart_engine (~> 0.5)
84
- smart_engine (0.7.0)
85
75
  thread_safe (0.3.6)
86
76
  tzinfo (1.2.7)
87
77
  thread_safe (~> 0.1)
88
78
  unicode-display_width (1.7.0)
89
- zeitwerk (2.3.1)
79
+ zeitwerk (2.3.0)
90
80
 
91
81
  PLATFORMS
92
82
  ruby
@@ -94,7 +84,6 @@ PLATFORMS
94
84
  DEPENDENCIES
95
85
  armitage-rubocop (~> 0.85)
96
86
  bundler (~> 2.1)
97
- pry (~> 0.13)
98
87
  rake (~> 13.0)
99
88
  rspec (~> 3.9)
100
89
  simplecov (~> 0.18)
data/README.md CHANGED
@@ -2,26 +2,6 @@
2
2
 
3
3
  Dependency injection principles and idioms realized in scope of Ruby.
4
4
 
5
- ---
6
-
7
- ## Major Features
8
-
9
- - `method-injection` strategy
10
- - `soon:` constructor injection strategy;
11
- - `soon:` property injection strategy;
12
- - realized as a mixin;
13
- - instance-method dependency injection;
14
- - class-method dependency injection;
15
- - multiple IoC-container registration;
16
- - static and dynamic bindings;
17
- - support for memoization with run-time dependency-switchable re-memoization;
18
- - an ability to import dependencies from the list of IoC-containers
19
- - an ability to import from the pre-configured default IoC-container(s);
20
- - an ability to import from any manually passed IoC-container;
21
- - privacy control of injected dependency (public/private/protected);
22
-
23
- ---
24
-
25
5
  ## Installation
26
6
 
27
7
  ```ruby
@@ -40,71 +20,6 @@ require 'smart_core/injection'
40
20
 
41
21
  ---
42
22
 
43
- ## Synopsis
44
-
45
- Create some containers:
46
-
47
- ```ruby
48
- AppContainer = SmartCore::Container.define do
49
- namespace(:data_storage) do
50
- register(:main) { Sequel::Model.db }
51
- register(:cache) { Redis.new }
52
- end
53
- end
54
-
55
- ServiceContainer = SmartCore::Container.define do
56
- namespace(:rands) do
57
- register(:alphanum) { -> { SeureRandom.alphanumeric } }
58
- register(:hex) { -> { SecureRandom.hex } }
59
- end
60
- end
61
-
62
- GlobalContainer = SmartCore::Container.define do
63
- namespace(:phone_clients) do
64
- register(:nexmo) { Nexmo.new }
65
- register(:twilio) { Twilio.new }
66
- end
67
- end
68
- ```
69
-
70
- And work with dependency injection:
71
-
72
- ```ruby
73
- class MiniService
74
- include SmartCore::Injection
75
-
76
- register_container(AppContainer)
77
- register_container(ServiceContainer)
78
-
79
- # --- or ---
80
- include SmartCore::Injection(AppContainer, ServiceContainer)
81
-
82
- # --- or ---
83
- include SmartCore::Injection
84
- register_container(AppContainer, ServiceContainer)
85
-
86
- # import dependencies to an instance
87
- import({ db: 'data_storage.main' }, bind: :dynamic, access: :private)
88
- import({ rnd: 'rands.alphanum' }, bind: :static, memoize: true)
89
-
90
- # import dependencies to a class
91
- import_static({ cache: 'data_storage.cache', hexer: 'rands.hex' }, bind: :static)
92
-
93
- # import from a non-registered container
94
- import({ phone_client: 'phone_clients.nexmo' }, from: GlobalContainer)
95
-
96
- def call
97
- db # => returns data_storage.main
98
- rnd # => returns rands.alphanum
99
- self.class.cache # => returns data_storage.cache
100
- self.class.hexer # => returns rands.hexer
101
- phone_client # => returns phone_clients.nexmo
102
- end
103
- end
104
- ```
105
-
106
- ---
107
-
108
23
  ## Contributing
109
24
 
110
25
  - Fork it ( https://github.com/smart-rb/smart_injection )
@@ -6,6 +6,6 @@ module SmartCore
6
6
  #
7
7
  # @api public
8
8
  # @since 0.1.0
9
- VERSION = '0.0.0.alpha3'
9
+ VERSION = '0.0.0'
10
10
  end
11
11
  end
@@ -1,44 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'smart_core/container'
4
- require 'set'
5
-
6
3
  # @api public
7
4
  # @since 0.1.0
8
5
  module SmartCore
9
- # TODO: обязательно учесть наследование
10
-
11
- class << self
12
- # @param containers [Array<SmartCore::Container>]
13
- # @return [Module]
14
- #
15
- # @api public
16
- # @since 0.1.0
17
- # rubocop:disable Naming/MethodName
18
- def Injection(*containers)
19
- ::SmartCore::Injection::Injector::Modulizer.with_containers(containers)
20
- end
21
- # rubocop:enable Naming/MethodName
22
- end
23
-
24
6
  # @api public
25
7
  # @since 0.1.0
26
8
  module Injection
27
9
  require_relative 'injection/version'
28
- require_relative 'injection/errors'
29
- require_relative 'injection/injector'
30
- require_relative 'injection/locator'
31
- require_relative 'injection/dsl'
32
-
33
- class << self
34
- # @param base_klass [Class, Module]
35
- # @return [void]
36
- #
37
- # @api private
38
- # @since 0.1.0
39
- def included(base_klass)
40
- ::SmartCore::Injection::Injector::Modulizer.inject_to(base_klass)
41
- end
42
- end
43
10
  end
44
11
  end
@@ -5,10 +5,10 @@ require_relative 'lib/smart_core/injection/version'
5
5
  Gem::Specification.new do |spec|
6
6
  spec.required_ruby_version = Gem::Requirement.new('>= 2.4.10')
7
7
 
8
- spec.name = 'smart_injection'
8
+ spec.name = "smart_injection"
9
9
  spec.version = SmartCore::Injection::VERSION
10
- spec.authors = ['Rustam Ibragimov']
11
- spec.email = ['iamdaiver@gmail.com']
10
+ spec.authors = ["Rustam Ibragimov"]
11
+ spec.email = ["iamdaiver@gmail.com"]
12
12
 
13
13
  spec.summary = 'DI principles and idioms realized in scope of Ruby'
14
14
  spec.description = 'DI principles and idioms realized in scope of Ruby'
@@ -30,13 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ['lib']
32
32
 
33
- spec.add_runtime_dependency 'smart_engine', '~> 0.7'
34
- spec.add_runtime_dependency 'smart_container', '~> 0.8', '>= 0.8.1'
35
-
36
33
  spec.add_development_dependency 'bundler', '~> 2.1'
37
34
  spec.add_development_dependency 'rake', '~> 13.0'
38
35
  spec.add_development_dependency 'rspec', '~> 3.9'
39
36
  spec.add_development_dependency 'armitage-rubocop', '~> 0.85'
40
37
  spec.add_development_dependency 'simplecov', '~> 0.18'
41
- spec.add_development_dependency 'pry', '~> 0.13'
42
38
  end
metadata CHANGED
@@ -1,49 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_injection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.alpha3
4
+ version: 0.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-09 00:00:00.000000000 Z
11
+ date: 2020-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: smart_engine
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.7'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '0.7'
27
- - !ruby/object:Gem::Dependency
28
- name: smart_container
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0.8'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 0.8.1
37
- type: :runtime
38
- prerelease: false
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - "~>"
42
- - !ruby/object:Gem::Version
43
- version: '0.8'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 0.8.1
47
13
  - !ruby/object:Gem::Dependency
48
14
  name: bundler
49
15
  requirement: !ruby/object:Gem::Requirement
@@ -114,20 +80,6 @@ dependencies:
114
80
  - - "~>"
115
81
  - !ruby/object:Gem::Version
116
82
  version: '0.18'
117
- - !ruby/object:Gem::Dependency
118
- name: pry
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '0.13'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '0.13'
131
83
  description: DI principles and idioms realized in scope of Ruby
132
84
  email:
133
85
  - iamdaiver@gmail.com
@@ -149,20 +101,6 @@ files:
149
101
  - bin/console
150
102
  - bin/setup
151
103
  - lib/smart_core/injection.rb
152
- - lib/smart_core/injection/dsl.rb
153
- - lib/smart_core/injection/errors.rb
154
- - lib/smart_core/injection/injector.rb
155
- - lib/smart_core/injection/injector/container_set.rb
156
- - lib/smart_core/injection/injector/container_set/adding_listener.rb
157
- - lib/smart_core/injection/injector/injection_settings.rb
158
- - lib/smart_core/injection/injector/injection_settings/incompatability_control.rb
159
- - lib/smart_core/injection/injector/modulizer.rb
160
- - lib/smart_core/injection/injector/strategies.rb
161
- - lib/smart_core/injection/injector/strategies/method_injection.rb
162
- - lib/smart_core/injection/locator.rb
163
- - lib/smart_core/injection/locator/container_proxy.rb
164
- - lib/smart_core/injection/locator/dependency.rb
165
- - lib/smart_core/injection/locator/factory.rb
166
104
  - lib/smart_core/injection/version.rb
167
105
  - smart_injection.gemspec
168
106
  homepage: https://github.com/smart-rb/smart_injection
@@ -183,9 +121,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
121
  version: 2.4.10
184
122
  required_rubygems_version: !ruby/object:Gem::Requirement
185
123
  requirements:
186
- - - ">"
124
+ - - ">="
187
125
  - !ruby/object:Gem::Version
188
- version: 1.3.1
126
+ version: '0'
189
127
  requirements: []
190
128
  rubygems_version: 3.1.2
191
129
  signing_key:
@@ -1,107 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @api public
4
- # @since 0.1.0
5
- module SmartCore::Injection::DSL
6
- class << self
7
- # @param base_klass [Class, Module]
8
- # @return [void]
9
- #
10
- # @api private
11
- # @since 0.1.0
12
- def included(base_klass)
13
- base_klass.instance_variable_set(
14
- :@__smart_injection_injector__,
15
- SmartCore::Injection::Injector.new(base_klass)
16
- )
17
-
18
- base_klass.extend(ClassMethods)
19
- base_klass.singleton_class.prepend(ClassInheritance)
20
- end
21
- end
22
-
23
- # @api private
24
- # @since 0.1.0
25
- module ClassInheritance
26
- # @param child_klass [Class]
27
- # @return [void]
28
- #
29
- # @api private
30
- # @since 0.1.0
31
- def inherited(child_klass)
32
- child_klass.instance_variable_set(
33
- :@__smart_injection_injector__,
34
- __smart_injection_injector__.duplicate_for(child_klass)
35
- )
36
- child_klass.singleton_class.prepend(ClassInheritance)
37
- super
38
- end
39
- end
40
-
41
- # @api private
42
- # @since 0.1.0
43
- module ClassMethods
44
- # @param imports [Hash<String|Symbol,String>]
45
- # @option memoize [Boolean]
46
- # @option access [Symbol]
47
- # @option bind [Symbol]
48
- # @option from [NilClass, SmartCore::Container]
49
- # @return [void]
50
- #
51
- # @api public
52
- # @sincd 0.1.0
53
- def import(
54
- imports,
55
- memoize: SmartCore::Injection::Injector::InjectionSettings::DEFAULT_MEMOIZE,
56
- access: SmartCore::Injection::Injector::InjectionSettings::DEFAULT_ACCESS,
57
- bind: SmartCore::Injection::Injector::InjectionSettings::DEFAULT_BINDING_STRATEGY,
58
- from: SmartCore::Injection::Injector::InjectionSettings::EMPTY_CONTAINER_DESTINATION
59
- )
60
- __smart_injection_injector__.inject(imports, memoize, access, bind, from)
61
- end
62
-
63
- # @param imports [Hash<String|Symbol,String>]
64
- # @option memoize [Boolean]
65
- # @option access [Symbol]
66
- # @option bind [Symbol]
67
- # @option from [NilClass, SmartCore::Container]
68
- # @return [void]
69
- #
70
- # @api public
71
- # @sincd 0.1.0
72
- def import_static(
73
- imports,
74
- memoize: SmartCore::Injection::Injector::InjectionSettings::DEFAULT_MEMOIZE,
75
- access: SmartCore::Injection::Injector::InjectionSettings::DEFAULT_ACCESS,
76
- bind: SmartCore::Injection::Injector::InjectionSettings::DEFAULT_BINDING_STRATEGY,
77
- from: SmartCore::Injection::Injector::InjectionSettings::EMPTY_CONTAINER_DESTINATION
78
- )
79
- __smart_injection_injector__.inject_static(imports, memoize, access, bind, from)
80
- end
81
-
82
- # @param containers [Array<SmartCore::Container>]
83
- # @return [void]
84
- #
85
- # @api public
86
- # @since 0.1.0
87
- def register_container(*containers)
88
- __smart_injection_injector__.register_container(*containers)
89
- end
90
-
91
- # @return [Array<SmartCore::Container>]
92
- #
93
- # @api public
94
- # @since 0.1.0
95
- def linked_containers
96
- __smart_injection_injector__.associated_containers
97
- end
98
-
99
- # @return [SmartCore::Injection::Injector]
100
- #
101
- # @api private
102
- # @since 0.1.0
103
- def __smart_injection_injector__
104
- @__smart_injection_injector__
105
- end
106
- end
107
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SmartCore::Injection
4
- # @api public
5
- # @since 0.1.0
6
- Error = Class.new(SmartCore::Error)
7
-
8
- # @api public
9
- # @since 0.1.0
10
- ArgumentError = Class.new(SmartCore::ArgumentError)
11
-
12
- # @api public
13
- # @since 0.1.0
14
- NoRegisteredContainersError = Class.new(Error)
15
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @api private
4
- # @since 0.1.0
5
- class SmartCore::Injection::Injector::ContainerSet::AddingListener
6
- # @param listener [Proc]
7
- # @return [void]
8
- #
9
- # @api private
10
- # @since 0.1.0
11
- def initialize(listener)
12
- @listener = listener
13
- end
14
-
15
- # @param cotnainer [SmartCore::Container]
16
- #
17
- # @api private
18
- # @since 0.1.0
19
- def notify(container)
20
- listener.call(container)
21
- end
22
-
23
- private
24
-
25
- # @return [Proc]
26
- #
27
- # @api private
28
- # @since 0.1.0
29
- attr_reader :listener
30
- end
@@ -1,113 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @api private
4
- # @since 0.1.0
5
- class SmartCore::Injection::Injector::ContainerSet
6
- require_relative 'container_set/adding_listener'
7
-
8
- # @since 0.1.0
9
- include Enumerable
10
-
11
- # @return [void]
12
- #
13
- # @api private
14
- # @since 0.1.0
15
- def initialize
16
- @containers = [] # NOTE: we use Array cuz we need an ordered set
17
- @adding_listeners = []
18
- @access_lock = SmartCore::Engine::Lock.new
19
- end
20
-
21
- # @param container [SmartCore::Container]
22
- # @return [void]
23
- #
24
- # @api private
25
- # @since 0.1.0
26
- def add(container)
27
- thread_safe { append_container(container) }
28
- end
29
- alias_method :<<, :add
30
-
31
- # @param listener [Block]
32
- # @yield [container]
33
- # @yieldparam container [SmartCore::Container]
34
- # @return [void]
35
- #
36
- # @api private
37
- # @since 0.1.0
38
- def listen_addings(&listener)
39
- thread_safe { add_adding_listener(listener) }
40
- end
41
-
42
- # @param block [Block]
43
- # @yield [container]
44
- # @yieldparam container [SmartCore::Container]
45
- # @return [Enumerator]
46
- #
47
- # @api private
48
- # @since 0.1.0
49
- def each(&block)
50
- thread_safe { block_given? ? containers.each(&block) : containers.each }
51
- end
52
-
53
- # @param block [Block]
54
- # @yield [container]
55
- # @yieldparam container [SmartCore::Container]
56
- # @return [Enumerator]
57
- #
58
- # @api private
59
- # @since 0.1.0
60
- def reverse_each(&block)
61
- thread_safe { block_given? ? containers.reverse_each(&block) : containers.reverse_each }
62
- end
63
-
64
- # @return [Array<SmartCore::Container>]
65
- #
66
- # @api private
67
- # @since 0.1.0
68
- def list
69
- thread_safe { containers.dup }
70
- end
71
-
72
- private
73
-
74
- # @return [Array<SmartCore::Container>]
75
- #
76
- # @api private
77
- # @since 0.1.0
78
- attr_reader :containers
79
-
80
- # @return [Array<SmartCore::Injection::Injector::ContainerSet::AddingListener>]
81
- attr_reader :adding_listeners
82
-
83
- # @param listener [Proc]
84
- # @return [void]
85
- #
86
- # @api private
87
- # @since 0.1.0
88
- def add_adding_listener(listener)
89
- adding_listeners << SmartCore::Injection::Injector::ContainerSet::AddingListener.new(listener)
90
- end
91
-
92
- # @param container [SmartCore::Container]
93
- # @return [void]
94
- #
95
- # @api private
96
- # @since 0.1.0
97
- def append_container(container)
98
- # NOTE:
99
- # - #concant is used to prevent container duplications in ordered set;
100
- # - @containers should have an ordered unified container list;
101
- containers.concat([container])
102
- adding_listeners.each { |listener| listener.notify(container) }
103
- end
104
-
105
- # @param block [Block]
106
- # @return [Any]
107
- #
108
- # @api private
109
- # @since 0.1.0
110
- def thread_safe(&block)
111
- @access_lock.synchronize(&block)
112
- end
113
- end