File: prependable.rb [mechanize-2.7.2 Documentation]

Last Modified
  2014-03-27 02:38:46 +0000
Requires

## Description

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