From: Matt Pattison Date: 2003-06-14T12:42:48+09:00 Subject: un_extend - dynamic mix-out? I know that I can do obj.extend(Mod) to dynamically mixin a module. But how can I get rid of this module and replace it with something else? Is there a way of effectively doing un_extend(Mod); extend(Mod2)? I want to program agents that can adapt their behaviour to the situation or context they find themselves in, i.e. context-dependent behaviours. #A simple example of something I'd like to be able to do: class IPD_Agent def initialize(strategy) @strategy = Object.const_get(strategy) extend(@strategy) end def change_strategy(strategy) #this is the command I want un_extend(@strategy) @strategy = Object.const_get(strategy) extend(@strategy) end end #Tft, AllC and AllD are different behaviour modules agent = IPD_Agent.new(:Tft) agent.change_strategy(:AllC) agent.change_strategy(:AllD) I'm currently doing effectively this via Delegation, which works quite well. There might be other ways of doing this that don't require un_extend. I specifically want to know though whether there is some hidden way to un_extend a dynamically added module from an object, or at least to find reliably which methods have been dynamically added to an object (i.e. to its special singleton class) and remove those (but not, for instance, stopping the object from responding to each or to_s if they have been dynamically redefined). Matt