aliasing an external method from within a method definition?

F

Francis Hwang

So maybe some of you language wizards out there can help me with this:
Is there a way to define a method that aliases some external method
without assigning that method to a global in the first place?

The example is the code below: For mockfs/override.rb, I'm undefining
File, but want to keep File.join.

$join_method = File.method :join
Object.send( :remove_const, :File )
module File
def self.join( *args )
$join_method.call *args
end

def self.method_missing( symbol, *args )
MockFS.file.send( symbol, *args )
end
end

This works, but then I'm leaving a global variable just sitting around.
Is there a better way to do this?

Francis Hwang
http://fhwang.net/
 
J

Joel VanderWerf

Francis said:
So maybe some of you language wizards out there can help me with this:
Is there a way to define a method that aliases some external method
without assigning that method to a global in the first place?

The example is the code below: For mockfs/override.rb, I'm undefining
File, but want to keep File.join.

$join_method = File.method :join
Object.send( :remove_const, :File )
module File
def self.join( *args )
$join_method.call *args
end

def self.method_missing( symbol, *args )
MockFS.file.send( symbol, *args )
end
end

This works, but then I'm leaving a global variable just sitting around.
Is there a better way to do this?

I'll be the firstest with the worstest:

x = 1
M = Module.new do
(class << self; self; end).instance_eval do
define_method :foo do
x
end
end
end

p M.foo # ==> 1

Mutatis mutandis.
 
L

Luke Graham

So maybe some of you language wizards out there can help me with this:
Is there a way to define a method that aliases some external method
without assigning that method to a global in the first place?

The example is the code below: For mockfs/override.rb, I'm undefining
File, but want to keep File.join.

$join_method = File.method :join
Object.send( :remove_const, :File )
module File
def self.join( *args )
$join_method.call *args
end

def self.method_missing( symbol, *args )
MockFS.file.send( symbol, *args )
end
end

This works, but then I'm leaving a global variable just sitting around.
Is there a better way to do this?

Im a long way from a wizard, but how about this...

OldFile = File.clone
Object.send :remove_const, :File
module File
OldFile = OldFile.clone
def self.method_missing(symbol, *args)
File.send symbol, *args
end
end
 
L

Luke Graham

Im a long way from a wizard, but how about this...

OldFile = File.clone
Object.send :remove_const, :File
module File
OldFile = OldFile.clone
def self.method_missing(symbol, *args)
File.send symbol, *args
end
end

Missed the final..

Object.send :remove_const, :OldFile

Better name the OldFile in the module something different too :p
 
P

Pit Capitain

Francis said:
Is there a way to define a method that aliases some external method
without assigning that method to a global in the first place?
...
This works, but then I'm leaving a global variable just sitting around.
Is there a better way to do this?

If you don't mind a local variable then this might help:

m = Module.new

class << m
define_method:)join, &File.method:)join))
def method_missing(*args)
args
end
end

Object.send:)remove_const, :File)
File = m

p File.join("a", "b") # => "a/b"
p File.open("x", "y", "z") # => [:eek:pen, "x", "y", "z"]

Regards,
Pit
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top