Skip to content

Commit 88bc209

Browse files
committed
Extract ReInclude
1 parent 94ee8b6 commit 88bc209

File tree

2 files changed

+59
-29
lines changed

2 files changed

+59
-29
lines changed

lib/concurrent/promises.rb

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,13 @@
33
require 'concurrent/atomic/atomic_fixnum'
44
require 'concurrent/collection/lock_free_stack'
55
require 'concurrent/errors'
6+
require 'concurrent/re_include'
67

78
module Concurrent
89

910
# {include:file:doc/promises-main.md}
1011
module Promises
1112

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-
4113
# @!macro [new] promises.param.default_executor
4214
# @param [Executor, :io, :fast] default_executor Instance of an executor or a name of the
4315
# global executor. Default executor propagates to chained futures unless overridden with

lib/concurrent/re_include.rb

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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

0 commit comments

Comments
 (0)