On Tue, Apr 11, 2006 at 02:19:30AM +0900, Robert Dober wrote:
} On 4/10/06, Gregory Seidman <gsslist+ruby / anthropohedron.net> wrote:
} >
} > On Mon, Apr 10, 2006 at 11:58:43PM +0900, TRANS wrote:
} > } > Is it possible to add class attributes (cattr_accessor) using a
} > module?
} > } > If so could you give an example?
} > }
} > } There is no "Ruby Way" to do this b/c Ruby's module methods aren't
} > } inherited by classes that include them. Though I've asked for a way
} > } man times now!
} > [...]
} > } Only ugly meta-programming hacks will give the sought behavior --and
} > } even then their are corner-case complications.
} >
} > Does this count as ugly meta-programming?
} >
} > module M
} >   def self.included(klass)
} >     class << klass
} >       attr_accessor :m
} >     end
} >   end
} > end
} 
} It is much prettier than the following ugly meta-programming, but I have no
} clue how it works !!!
} Could you explain please?

The first thing to understand is that when you define a class, e.g. class
Foo; ... end, you are just setting a constant (Object::Foo, in this case)
to a new instance of a Class. Just as you can add new methods to an
instance of any other kind of object with class << obj; ... end, you can
add new methods to Foo. When a module is included, its self.included method
is called with the Class instance it is being included into as an argument.
I am defining self.included to add an attribute accessor to that Class
instance.

} Thx
} Robert
[...]
--Greg