Roman Usherenko
Roman Usherenko

Reputation: 5639

Prepending to module that gets included/extended

I'm moving from using Module#alias_method_chain to Module#prepend.

But there is one situation where I cannot achieve the same functionality

Suppose I have a library code (two libraries actually, one of which enhances another)

# Library 1
object = Object.new
# Library 2
module Extender
  def random_number
    4
  end
end
object.extend Extender

object.random_number # => 4

Now, say I want object#random_number to return 5. My old code was

Extender.class_eval do
  def random_number_with_magic
    random_number_without_magic + 1
  end
  alias_method_chain :random_number, :magic
end

object.random_number # => 5

To mimic this using Module#prepend

module Prepender
  def random_number
    super + 1
  end
end
Extender.prepend Prepender

object.random_nuber # => still 4!

The desired results could be achieved by two approaches

Any advice?

Upvotes: 3

Views: 135

Answers (0)

Related Questions