Kelly Felkins wrote: > I'm trying to understand classes and objects. The Pick axe book > points out the "once" method in class Date and how it is defined > using the object singleton technique of "class << self". Actually > Date uses this in several places. Up until seeing Date I thought the > reason for this idiom was to add/replace methods in classes *when you > don't have convenient access to the class definition* -- basically, > use this when it's not your class you need to enhance. But the fact > that Date uses it several times indicates there is another reason to > use it. As you guessed the reasons are different: typically you use "class <<something...end" if you have to define several methods or if you need a class context for things to work (for example "alias"). These are equivalent: class Foo class <<self def m1() "foo" end end class <<Foo def m2() "foo" end end def self.m3() "foo" end def Foo.m4() "foo" end end class <<Foo def m5() "foo" end end def Foo.m6() "foo" end x = Foo def x.m7() "foo" end class <<x def m8() "foo" end end Now you have methods m1 to m8 as instance methods of Foo. You can do Foo.m1(), Foo.m2 etc. More technically, with class <<something ... end you make definition for the so called "singleton class" the class instance responsible for the single instance at hand (which happens to be a class object in this case; but you can repeat the example above with any object instead of Foo). You cannot create instances from this class: irb(main):001:0> class Foo irb(main):002:1> p new irb(main):003:1> end #<Foo:0x10192d58> => nil irb(main):004:0> class <<Foo irb(main):005:1> p new irb(main):006:1> end TypeError: can't create instance of virtual class from (irb):5:in `new' from (irb):5 > Here are some examples from Date: > class << self; alias_method :leap?, :gregorian_leap? end > class << self; alias_method :new0, :new end > > I just noticed that every use of class << self in Date contains an > alias_method. > > Please enlighten me. Hope, I could help. Kind regards robert