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