Module: Mechanize::Prependable

Defined in:
lib/mechanize/prependable.rb

Overview

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