# Alias callback

**URL:** <https://www.ruby-forum.com/t/alias-callback/83887>\
**Category:** Ruby\
**Created:** [January 30, 2007, 1:51pm UTC](https://www.ruby-forum.com/t/alias-callback/83887 "2007-01-30T13:51:19Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Trans](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/dfb087/32.png) [@Trans](https://www.ruby-forum.com/u/Trans)\
**Post date:** [January 30, 2007, 1:51pm UTC](https://www.ruby-forum.com/t/alias-callback/83887/1 "2007-01-30T13:51:19Z")

</div>

How does one reflect on alias definitions. Using #method\_added only  
gives you the name of the alias being defined --as if it were a new  
method. And it’s not possible to override ‘alias’ b/c it’s not a real  
method.

Ideas?

Thanks,  
T.

---

<div class="post-metadata">

**Author:** ![Trans](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/dfb087/32.png) [@Trans](https://www.ruby-forum.com/u/Trans)\
**Post date:** [January 30, 2007, 6:15pm UTC](https://www.ruby-forum.com/t/alias-callback/83887/2 "2007-01-30T18:15:21Z")

</div>

Module has a method alias\_method, which could be overridden. Probably  
not quite what you’re looking for.

AFAIK alias duplicates the method (not really an alias), hence the  
described behaviour.

class A  
def a  
1  
end  
alias b a  
end

class A  
def a  
2  
end  
end

A.new.b  
=\> 1

---

<div class="post-metadata">

**Author:** ![Trans](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/dfb087/32.png) [@Trans](https://www.ruby-forum.com/u/Trans)\
**Post date:** [January 31, 2007, 12:49pm UTC](https://www.ruby-forum.com/t/alias-callback/83887/3 "2007-01-31T12:49:07Z")

</div>

On 1/30/07, Trans [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> How does one reflect on alias definitions. Using #method\_added only  
> gives you the name of the alias being defined --as if it were a new  
> method. And it’s not possible to override ‘alias’ b/c it’s not a real  
> method.
> 
> Ideas?

UnboundMethod#== returns true for aliases, so hopefully:

class Module  
def alias?(name)  
name = name.to\_s  
instance\_method = instance\_method(name)  
(instance\_methods + private\_instance\_methods).any? do |n|  
n != name && instance\_method(n) == instance\_method  
end  
end  
end

Bit of a test:

require ‘test/unit’  
class AliasTest \< Test::Unit::TestCase  
def test\_by\_alias  
klass = Class.new do  
def foo  
end  
def bar  
end  
alias baz foo  
end  
assert klass.alias?(:foo)  
assert !klass.alias?(:bar)  
assert klass.alias?(:baz)  
end  
def test\_by\_alias\_method  
klass = Class.new do  
def foo  
end  
def bar  
end  
alias\_method :baz, :foo  
end  
assert klass.alias?(:foo)  
assert !klass.alias?(:bar)  
assert klass.alias?(:baz)  
end  
def test\_across\_inheritance  
klass = Class.new{alias foo object\_id}  
assert klass.alias?(:foo)  
assert klass.alias?(:object\_id)  
end  
def test\_nonalias  
klass = Class.new{def foo; end}  
assert !klass.alias?(:foo)  
end  
def test\_builtin  
assert Array.alias?(:size)  
assert Array.alias?(:length)  
assert !Array.alias?(:clear)  
end  
end

---

<div class="post-metadata">

**Author:** ![Trans](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/dfb087/32.png) [@Trans](https://www.ruby-forum.com/u/Trans)\
**Post date:** [January 31, 2007, 8:51pm UTC](https://www.ruby-forum.com/t/alias-callback/83887/4 "2007-01-31T20:51:02Z")

</div>

On Jan 31, 6:48 am, “George O.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On 1/30/07, Trans [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > How does one reflect on alias definitions. Using #method\_added only  
> > gives you the name of the alias being defined --as if it were a new  
> > method. And it’s not possible to override ‘alias’ b/c it’s not a real  
> > method.
> 
> > Ideas?
> 
> UnboundMethod#== returns true for aliases, so hopefully:

Good thinking!

> class Module  
> def alias?(name)  
> name = name.to\_s  
> instance\_method = instance\_method(name)  
> (instance\_methods + private\_instance\_methods).any? do |n|  
> n != name && instance\_method(n) == instance\_method  
> end  
> end  
> end

[snip]

Nice. I’ll give this a whril and put it in Facets, crediting you.

Super Thanks!!!  
T.
