views:

92

answers:

1

Greetings,

I've been trying to tinker with a global Cache module, but I can't figure out why this isn't working.

Does anyone have any suggestions?

This is the error produced for the below code:

NameError: undefined method get' for moduleCache' from (irb):21:in `alias_method'

module Cache

  def self.get
    puts "original"
  end

end

module Cache

  def self.get_modified
    puts "New get"
  end

end

def peek_a_boo

  Cache.module_eval do
    # make :get_not_modified
    alias_method :get_not_modified, :get
    alias_method :get, :get_modified
  end

  Cache.get

  Cache.module_eval do
    alias_method :get, :get_not_modified
  end
end

# test first round
peek_a_boo

# test second round
peek_a_boo

TIA!

-daniel

+2  A: 

The calls to alias_method will attempt to operate on instance methods. There is no instance method named get in your Cache module, so it fails.

Because you want to alias class methods (methods on the metaclass of Cache), you would have to do something like:

class << Cache  # Change context to metaclass of Cache
  alias_method :get_not_modified, :get
  alias_method :get, :get_modified
end

Cache.get

class << Cache  # Change context to metaclass of Cache
  alias_method :get, :get_not_modified
end
molf
You don't need the whole `Cache.module_eval do class << self` — you can just write `class << Cache`.
Chuck
@Chuck, good point; updated!
molf