File tree Expand file tree Collapse file tree 2 files changed +59
-29
lines changed Expand file tree Collapse file tree 2 files changed +59
-29
lines changed Original file line number Diff line number Diff line change 3
3
require 'concurrent/atomic/atomic_fixnum'
4
4
require 'concurrent/collection/lock_free_stack'
5
5
require 'concurrent/errors'
6
+ require 'concurrent/re_include'
6
7
7
8
module Concurrent
8
9
9
10
# {include:file:doc/promises-main.md}
10
11
module Promises
11
12
12
- # TODO (pitr-ch 23-Dec-2016): move out
13
- # @!visibility private
14
- module ReInclude
15
- def included ( base )
16
- included_into << [ :include , base ]
17
- super ( base )
18
- end
19
-
20
- def extended ( base )
21
- included_into << [ :extend , base ]
22
- super ( base )
23
- end
24
-
25
- def include ( *modules )
26
- super ( *modules )
27
- modules . reverse . each do |module_being_included |
28
- included_into . each do |method , mod |
29
- mod . send method , module_being_included
30
- end
31
- end
32
- end
33
-
34
- private
35
-
36
- def included_into
37
- @included_into ||= [ ]
38
- end
39
- end
40
-
41
13
# @!macro [new] promises.param.default_executor
42
14
# @param [Executor, :io, :fast] default_executor Instance of an executor or a name of the
43
15
# global executor. Default executor propagates to chained futures unless overridden with
Original file line number Diff line number Diff line change
1
+ module Concurrent
2
+
3
+ # Methods form module A included to a module B, which is already included into class C,
4
+ # will not be visible in the C class. If this module is extended to B then A's methods
5
+ # are correctly made visible to C.
6
+ #
7
+ # @example
8
+ # module A
9
+ # def a
10
+ # :a
11
+ # end
12
+ # end
13
+ #
14
+ # module B1
15
+ # end
16
+ #
17
+ # class C1
18
+ # include B1
19
+ # end
20
+ #
21
+ # module B2
22
+ # extend Concurrent::ReInclude
23
+ # end
24
+ #
25
+ # class C2
26
+ # include B2
27
+ # end
28
+ #
29
+ # B1.send :include, A
30
+ # B2.send :include, A
31
+ #
32
+ # C1.new.respond_to? :a # => false
33
+ # C2.new.respond_to? :a # => true
34
+ module ReInclude
35
+ # @!visibility private
36
+ def included ( base )
37
+ ( @re_include_to_bases ||= [ ] ) << [ :include , base ]
38
+ super ( base )
39
+ end
40
+
41
+ # @!visibility private
42
+ def extended ( base )
43
+ ( @re_include_to_bases ||= [ ] ) << [ :extend , base ]
44
+ super ( base )
45
+ end
46
+
47
+ # @!visibility private
48
+ def include ( *modules )
49
+ result = super ( *modules )
50
+ modules . reverse . each do |module_being_included |
51
+ ( @re_include_to_bases ||= [ ] ) . each do |method , mod |
52
+ mod . send method , module_being_included
53
+ end
54
+ end
55
+ result
56
+ end
57
+ end
58
+ end
You can’t perform that action at this time.
0 commit comments