File: re_include.rb

package info (click to toggle)
ruby-concurrent 1.1.6%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 30,284 kB
  • sloc: ruby: 30,875; java: 6,117; javascript: 1,114; ansic: 288; makefile: 10; sh: 6
file content (58 lines) | stat: -rw-r--r-- 1,230 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
module Concurrent

  # Methods form module A included to a module B, which is already included into class C,
  # will not be visible in the C class. If this module is extended to B then A's methods
  # are correctly made visible to C.
  #
  # @example
  #   module A
  #     def a
  #       :a
  #     end
  #   end
  #
  #   module B1
  #   end
  #
  #   class C1
  #     include B1
  #   end
  #
  #   module B2
  #     extend Concurrent::ReInclude
  #   end
  #
  #   class C2
  #     include B2
  #   end
  #
  #   B1.send :include, A
  #   B2.send :include, A
  #
  #   C1.new.respond_to? :a # => false
  #   C2.new.respond_to? :a # => true
  module ReInclude
    # @!visibility private
    def included(base)
      (@re_include_to_bases ||= []) << [:include, base]
      super(base)
    end

    # @!visibility private
    def extended(base)
      (@re_include_to_bases ||= []) << [:extend, base]
      super(base)
    end

    # @!visibility private
    def include(*modules)
      result = super(*modules)
      modules.reverse.each do |module_being_included|
        (@re_include_to_bases ||= []).each do |method, mod|
          mod.send method, module_being_included
        end
      end
      result
    end
  end
end