def Module::doc(aClass)
# If we’re passed a class or module, convert to string
# (’<=’ for classes checks for same class or subtype)
aClass = aClass.name if aClass.class <= Module
@@docs[aClass] || “No documentation for #{aClass}”
end
end
class Example
doc(“This is a sample documentation string”)
def Module::doc(aClass)
# If we’re passed a class or module, convert to string
# (’<=’ for classes checks for same class or subtype)
aClass = aClass.name if aClass.class <= Module
@@docs[aClass] || “No documentation for #{aClass}”
end
end
class Example<Module
doc(“This is a sample documentation string”)
If i just change Modules’s name for Father for example:
class Father
@@docs = {}
def doc(str)
@@docs[self.name] = self.name + “:\n” + str.gsub(/^\s+/, ‘’)
end
def Father::show_doc(aClass)
aClass = aClass.name if aClass.class <= Module
@@docs[aClass] || “No documentation for #{aClass}”
end
end
class Example<Father
doc(“This is a sample documentation string”)
end
puts Father::show_doc(Example)
Produces:
undefined method `doc’ for Example:Class (NoMethodError)
class Father
doc(“This is a sample documentation string”)
doc is an instance method of Father, and Example is not an instance of
Father (it’s an instance of Class). So you can’t call doc on Example.
Wesley, IMHO there is an easier as well as safer solution: safer,
because a class’s name may be unset. Also, your solution keeps
documentation of all classes in memory even if they are GC’ed (if that’s
possible, I am not sure). So here’s what I’d do:
class Module
def doc(str = nil)
if str @doc = (name + “:\n” + str.strip).freeze
else @doc
end
end
end