I’m doing some meta-programming where I want to add the same
instance and class methods to many other existing classes,
which I don’t wish to re-superclass.
include works nicely for including instance methods,
but to make class extensions as well, I need to use extend
with a module that uses class_def (from _why’s metaid.rb)
Is there a way to avoid having to make two separate extension
modules and apply them separately, as in:
class Foo < …whatever…
include InstanceExtensions
extend ClassExtensions
…
end
What I’d like is to define one extension module having both
class and instance methods, and insert them both into my class
with one statement. If I include and extend the same module,
like Facet’s include_and_extend used to do, I get the instance
methods defined on the classes as well as the instances.
Any thoughts?
Clifford H…
On Feb 5, 2008, at 8:59 PM, Clifford H. wrote:
methods defined on the classes as well as the instances.
Any thoughts?
Clifford H…
module M
module ClassMethods
end
module InstanceMethods
end
def M.inherited other
other.send :extend, ClassMethods
other.send :include InstanceMethods
end
end
a @ http://codeforpeople.com/
ara howard wrote:
end
end
Interesting idea, but it doesn’t seem to work, and I don’t see
how it could (though I’ve mangled it into something different
that does work).
How and when should module M get used, and how does inherited
get called?
My look at the Ruby doc says the “inherited” callback only works
on classes, not on modules…? Is this a 1.9 thing? If I change
M to a class, then of course I can’t use it as the argument to
include or extend :-).
What I did get to work was to add a method to class Module that
does the include and extend. Which I guess I knew I could do anyhow…
Clifford H…
2008/2/6, Clifford H. [email protected]:
other.send :include InstanceMethods
My look at the Ruby doc says the “inherited” callback only works
on classes, not on modules…? Is this a 1.9 thing? If I change
M to a class, then of course I can’t use it as the argument to
include or extend :-).
What I did get to work was to add a method to class Module that
does the include and extend. Which I guess I knew I could do anyhow…
What stops you from doing
module InstMeths
end
module ClassMeths
end
def adjust(cl)
cl.extend ClassMeths
cl.send :include, InstMeths
end
adjust MyClass
adjust YourClass
or even
set_of_classes.each {|cl| adjust cl}
? (probably with a more expressive method name than “adjust”)
Kind regards
robert
Alle Wednesday 06 February 2008, Clifford H. ha scritto:
other.send :include InstanceMethods
My look at the Ruby doc says the “inherited” callback only works
on classes, not on modules…? Is this a 1.9 thing? If I change
M to a class, then of course I can’t use it as the argument to
include or extend :-).
What I did get to work was to add a method to class Module that
does the include and extend. Which I guess I knew I could do anyhow…
Clifford H…
I think you need M.included, not M.inherited:
module M
module ClassMethods
def m1
puts “m1”
end
end
module InstanceMethods
def m2
puts “m2”
end
end
def self.included other
other.send :include, InstanceMethods
other.send :extend, ClassMethods
end
end
class C
include M
end
C.m1
C.new.m2
Stefano
Stefano
ara howard wrote:
On Feb 6, 2008, at 8:54 AM, Stefano C. wrote:
I think you need M.included, not M.inherited:
yeah - typo - sorry.
it definitely works - i use it everywhere…
Thanks all, exactly what I wanted, works like a charm.
Clifford H…
On Feb 6, 2008, at 8:54 AM, Stefano C. wrote:
I think you need M.included, not M.inherited:
yeah - typo - sorry.
it definitely works - i use it everywhere…
cheers.
a @ http://codeforpeople.com/