IƱaki Baz Castillo wrote:
> Humm, I don't like adding "include Logging" to every classes I use since
> sometimes I use objects, sometimes classes, so I'd also need to "extend" 
> some classes not just "include".

You could use meta programming to include Logging in all nested classes 
and modules of your top-level module:

module FooBar
  # ... code from previous e-mail ...

  # recursively adds Logging functionality to all nested classes
  extender = lambda do |k|
    k.constants.map {|c| k.const_get c }.
    select {|c| c.is_a? Class or c.is_a? Module }.
    each do |c|
      c.extend Logging
      extender[c]
    end
  end

  extender[self]
end

>> # Using a LOG object
>> module FooBar
>>   LOG = Logger.new
>>
>>   class FooBar::Baz
>>     def oh_no
>>       LOG.debug "oh no!"
>>     end
>>   end
>> end
> 
> Ok, in this case you use a constant (LOG). This is the same I do now but 
> I use a global variable ($log). Is more ellegant using a constant?

Yes, in my opinion.  A constant is constrained to the walls of your 
library's top-level module, whereas a global variable is not. 
Therefore, unless someone was modifying your library, they would not be 
able to access your constant.
-- 
Posted via http://www.ruby-forum.com/.