Class methods in a module?

M

Max Williams

At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. Can anyone show me?

It was something along these lines...(the following doesn't work btw)

module Mappable

#instance methods
def foo
"foo"
end

#class methods
class << self.class
def bar
"bar"
end
end

end

can anyone set me straight?
thanks
max
 
J

James Coglan

[Note: parts of this message were removed to make it a legal post.]

2009/5/25 Max Williams said:
At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. Can anyone show me?

I'm not sure if you can pick up the singleton methods from the module and
automatically copy them to the class -- I've got type errors before when
trying to move and rebind methods. I did come up with this, though, which is
more expressive than writing an included() hook on every module:

http://gist.github.com/114042
 
R

Rick DeNatale

At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. =A0Can anyone show me?

It was something along these lines...(the following doesn't work btw)

module Mappable

=A0 #instance methods
=A0 def foo
=A0 =A0 "foo"
=A0 end

=A0 #class methods
=A0 class << self.class
=A0 =A0 def bar
=A0 =A0 =A0 "bar"
=A0 =A0 end
=A0 end

end

can anyone set me straight?
thanks
max


The usual way is to use the hook method Module#included, something like:

module Mappable

#instance methods
def foo
"foo"
end

#class methods
module ClassMethods
def bar
"bar"
end
end

def self.included(other)
other.extend(ClassMethods)
end
end

By the way this nesting of a Module inside a module is another variant
on something discussed in another recent ruby-talk thread.
--=20
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
 
J

James Britt

Max said:
At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. Can anyone show me?

It was something along these lines...(the following doesn't work btw)

module Stuff
module ClassMethods
def biff(*args)
# ...
end

def baz(*args)
# ...
end
end

def self.included(base)
base.extend(ClassMethods)
end


end

The methods defined in Stuff::ClassMethods are added as class methods when

include Stuff

is called



--
James Britt

www.jamesbritt.com - Playing with Better Toys
www.ruby-doc.org - Ruby Help & Documentation
www.rubystuff.com - The Ruby Store for Ruby Stuff
www.neurogami.com - Smart application development
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,071
Latest member
MetabolicSolutionsKeto

Latest Threads

Top