active_support/core_ext/module/attribute_accessors.rb をrequire。ちぃ覚えた。
Moduleを拡張しているのでrequireすればクラスに導入されますね。効果としてはクラスとインスタンス、両方のアクセサとして共通に使えるアクセサが定義できるようです。
ActiveRecord::Base.loggerを流用しようとして存在に気づいた。
gem 'activerecord' した環境で試してみると、以下のような感じ。
$ bundle exec ruby -e '
require "active_support/core_ext/module/attribute_accessors"
require "logger"
class TestClassA
mattr_accessor :logger
end
TestClassA.logger = Logger.new( STDERR )
TestClassA.logger.info( "Message from class method." )
TestClassA.new.logger.info( "Message from instance method." )
puts "Class method logger; #{TestClassA.logger}"
puts "Instance method logger; #{TestClassA.new.logger}"
'
I, [2015-05-15T12:04:17.514556 #30503] INFO -- : Message from class method.
I, [2015-05-15T12:04:17.514671 #30503] INFO -- : Message from instance method.
Class method logger; #<Logger:0x007f12f269f198>
Instance method logger; #<Logger:0x007f12f269f198>
確かにクラスメソッドでアクセスしてもインスタンスメソッドでアクセスしても、同じオブジェクトが入ってる。