bruce (owner)

Forks

Revisions

gist: 43027 Download_button fork
public
Public Clone URL: git://gist.github.com/43027.git
IRB Session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Playing with it in irb:
 
>> (class << Widget; self; end).ancestors
=> [BazWrapper, BarWrapper, FooWrapper, Class, Module, Object, Kernel]
 
>> widget = Widget.new
=> #<Widget:0x11771f8>
 
>> (class << widget; self; end).ancestors
=> [BazWrapper::WrappingB, BazWrapper::WrappingA, BarWrapper::Wrapping, FooWrapper::Wrapping,
Widget, Object, Kernel]
 
>> widget.render_on(nil)
BazWrapper::WrappingB
BazWrapper::WrappingA
BarWrapper::Wrapping
FooWrapper::Wrapping
Original
 
 
super-extend-multiple.rb
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
class Widget
  def render_on(document, options = {})
    puts "Original"
  end
end
 
module FooWrapper
  def new(*args, &block)
    super.extend Wrapping
  end
  module Wrapping
    def render_on(*args)
      puts "FooWrapper::Wrapping"
      super
    end
  end
end
 
module BarWrapper
  def new(*args, &block)
    super.extend Wrapping
  end
  module Wrapping
    def render_on(*args)
      puts "BarWrapper::Wrapping"
      super
    end
  end
end
  
module BazWrapper
  def new(*args, &block)
    instance = super
    instance.extend(WrappingA)
    instance.extend(WrappingB)
  end
  module WrappingA
    def render_on(*args)
      puts "BazWrapper::WrappingA"
      super
    end
  end
  module WrappingB
    def render_on(*args)
      puts "BazWrapper::WrappingB"
      super
    end
  end
end
 
Widget.extend FooWrapper
Widget.extend BarWrapper
Widget.extend BazWrapper