harp:~ > cat a.rb
class Module
def mod_attr a
module_eval <<-code
def #{ a }
self::class.send '#{ a }'
end
def #{ a }= value
self::class.send '#{ a }=', value
end
code
end
end
class C
def C::info
42
end
mod_attr 'info'
end
p C::info
p C::new.info
harp:~ > ruby a.rb
42
-a
···
On Tue, 18 Oct 2005, Bob Hutchison wrote:
Hi,
I'd like to confirm that I cannot use any kind of aliasing to tidy up the following situation:
class Junk
def Junk.info
"blah blah blah"
end
def info
Junk.info
end
end
I'd really like to be able to write the following:
puts Junk.info
# then somewhere far from there...
junk = Junk.new
puts junk.info
I don't find junk.class.info satisfying, and if that were a module method, then you have to know too much.
I guess what I'm trying to do is make class/module methods directly available to instances, and it seems I can't do that (whatever the reason).
Any better ideas are more than welcome.
Cheers,
Bob
--
email :: ara [dot] t [dot] howard [at] noaa [dot] gov
phone :: 303.497.6469
anything that contradicts experience and logic should be abandoned.
-- h.h. the 14th dalai lama
Though maybe class_function isn't the right name. Perhaps
instance_function or object_function? (All on analogy with
module_function). Also, it might be handy to do this:
class Class
def instance_function(*names)
names.each do |name|
class_eval { define_method(name, &method(name)) }
end
end
end
Thanks! I think a variation of Ara's and Sean's suggestion with your's Robert cover the various circumstances I've got to deal with.
You can automate things a bit (thanks to bitsweat for helping me find
singleton_method_added again). Here is a version which enables you to
easily control which classes have this feature:
module ParentalControls
module ClassIncludes
def singleton_method_added(sym)
class_eval <<-END
def #{sym}(*a, &b)
self.class.#{sym}(*a, &b)
end
END
end
end
def self.included(mod)
mod.extend ClassIncludes
end
end
class Foo
include ParentalControls
def self.foo()
42
end
end
puts Foo.foo
puts Foo.new.foo
Cheers,
Bob
Bob Hutchison wrote:
Hi,
I'd like to confirm that I cannot use any kind of aliasing to tidy up
the following situation:
class Junk
def Junk.info
"blah blah blah"
end
def info
Junk.info
end
end
I'd really like to be able to write the following:
puts Junk.info
# then somewhere far from there...
junk = Junk.new
puts junk.info
I don't find junk.class.info satisfying, and if that were a module
method, then you have to know too much.
I guess what I'm trying to do is make class/module methods directly
available to instances, and it seems I can't do that (whatever the
reason).
Any better ideas are more than welcome.
Here's another approach:
module Helper
def info() 42 end
end
class Foo
include Helper
extend Helper
end