Aliasing an external method from within a method definition?

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/

Francis Hwang wrote:

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.

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

···

On Mon, 7 Mar 2005 16:03:40 +0900, Francis Hwang <sera@fhwang.net> wrote:

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?

--
spooq

Francis Hwang schrieb:

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") # => [:open, "x", "y", "z"]

Regards,
Pit

Missed the final..

Object.send :remove_const, :OldFile

Better name the OldFile in the module something different too :stuck_out_tongue:

···

On Mon, 7 Mar 2005 17:31:24 +1000, Luke Graham <spoooq@gmail.com> wrote:

On Mon, 7 Mar 2005 16:03:40 +0900, Francis Hwang <sera@fhwang.net> wrote:
> 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

--
spooq