A
ara.t.howard
i've been wanting a better alias_method for quite some time. essentially i'd
like a way out of the trap where executing
alias_method '__fubar__', 'fubar'
goes haywire when __fubar__ already exists. we've all seen it happen before.
anyhow. the interface it'd like would be
class C
def m() 'a' end
push_method 'm'
def m() super + 'b' end
end
p C.new.m #=> 'ab'
what i've got is quite close, but no cigar. it has a fundemental problem with
the way ruby scopes super which i'm too tired atttm to figure out. i'm hoping
i can go to bed and wake up to a nice patch ;-) here's what i've got:
harp:~ > cat a.rb
class Module
def push_method m
this = self
include Module.new{
@m = this.instance_method m
this.module_eval{ remove_method m }
module_eval <<-code
def #{ m }(*a, &b)
um = ObjectSpace._id2ref #{ @m.object_id }
um.bind(self).call *a, &b
end
code
}
end
end
class C
def m
'a'
end
p new.m #=> 'a'
push_method 'm'
def m
super + 'b'
end
p new.m #=> 'ab'
push_method 'm'
def m
super + 'c'
end
p new.m #=> 'abc'
end
harp :~ > ruby a.rb
"a"
"ab"
a.rb:31:in `m': stack level too deep (SystemStackError)
from (eval):3:in `m'
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:31:in `m'
... 2343 levels...
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:40:in `m'
from a.rb:42
have at it - i'll be back in 8 hrs. ;-)
-a
like a way out of the trap where executing
alias_method '__fubar__', 'fubar'
goes haywire when __fubar__ already exists. we've all seen it happen before.
anyhow. the interface it'd like would be
class C
def m() 'a' end
push_method 'm'
def m() super + 'b' end
end
p C.new.m #=> 'ab'
what i've got is quite close, but no cigar. it has a fundemental problem with
the way ruby scopes super which i'm too tired atttm to figure out. i'm hoping
i can go to bed and wake up to a nice patch ;-) here's what i've got:
harp:~ > cat a.rb
class Module
def push_method m
this = self
include Module.new{
@m = this.instance_method m
this.module_eval{ remove_method m }
module_eval <<-code
def #{ m }(*a, &b)
um = ObjectSpace._id2ref #{ @m.object_id }
um.bind(self).call *a, &b
end
code
}
end
end
class C
def m
'a'
end
p new.m #=> 'a'
push_method 'm'
def m
super + 'b'
end
p new.m #=> 'ab'
push_method 'm'
def m
super + 'c'
end
p new.m #=> 'abc'
end
harp :~ > ruby a.rb
"a"
"ab"
a.rb:31:in `m': stack level too deep (SystemStackError)
from (eval):3:in `m'
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:31:in `m'
... 2343 levels...
from a.rb:31:in `m'
from (eval):3:in `m'
from a.rb:40:in `m'
from a.rb:42
have at it - i'll be back in 8 hrs. ;-)
-a