module Mechanize::Prependable
Fake implementation of prepend(), which does not support overriding inherited methods nor methods that are formerly overridden by another invocation of prepend().
Here's what <Original>.prepend(<Wrapper>) does:
-
Create an anonymous stub module (hereinafter <Stub>) and define <Stub>#<method> that calls #<method>without<Wrapper> for each instance method of <Wrapper>.
-
Rename <Original>#<method> to #<method>without<Wrapper> for each instance method of <Wrapper>.
-
Include <Wrapper> and <Stub> into <Original> in that order.
This way, a call of <Original>#<method> is dispatched to <Wrapper><method>, which may call super which is dispatched to <Stub>#<method>, which finally calls <Original>#<method>without<Wrapper> which is used to be called <Original>#<method>.
Usage:
class Mechanize # module with methods that overrides those of X module Y end unless X.respond_to?(:prepend, true) require 'mechanize/prependable' X.extend(Prependable) end class X prepend Y end end