From: John Carter Date: 2005-12-06T09:57:46+09:00 Subject: Subclassing Class. Ok. This is a wild idea. I don't like the factory pattern. We don't need no stinkin Factories. We have the Class object. All a Factory is really Class. However, a traditional Factory object can have... * State. * Richer behaviour than the Class class. Ok, this gets a little hairy so lets get concrete. class Foo end fo = Foo.new What is the class of fo? Foo What is the class of Foo? Class Now a FooFactory object is just an object with a bit more intelligence and state that the traditional Foo class object for making Foo instances in a better smarter way. So the obvious thing to do is instead of making a new class FooFactory < Object, it should inherit from Class. Well, since Foo is already a Class, we really just want a smarter Class. ie.. Instead of class FooFactory def initialize( foo_state) @foo_state = foo_state end def foo_fu( bah) # Knowledge of Foo making end def create( needs_fu, stuff) Foo.new( foo_fu( needs_fu), @foo_state, stuff) end end factory = FooFactory.new( 'foo juice') foo = factory.create( 'footile') We really want class Foo < Class def initialize( foo_state) @foo_state = foo_state end def foo_fu( bah) # Knowledge of Foo making end def new( needs_fu, stuff) super( foo_fu( needs_fu), @foo_state, stuff) end end foo = Foo.new( 'fooless', 'stuffed') Except ruby doesn't like that class Foo < Class bit. It gets quite grumpy in fact. Ruby says "can't make subclass of Class (TypeError)" Rats. We can however say... FooClass = Class.new(Class) Unfortunately we can't then say.... FooClass.new( Object) Ruby says... :in `new': wrong instance allocation (TypeError) Ahh! I'm just going around in circles fighting Ruby. We need a way of saying... class FooClass < Class # Add state and behaviour to Class end And then instead of saying... class Foo < FooParent # Add state and behaviour to FooParent end we need to be able to say... FooClass Foo < FooParent # Add state and behaviour to FooParent end Aargh! I'm chasing my tail. Is there anyway, (short of the traditional Factory Pattern) for me to catch my tail? John Carter Phone : (64)(3) 358 6639 Tait Electronics Fax : (64)(3) 359 4632 PO Box 1645 Christchurch Email : john.carter@tait.co.nz New Zealand Carter's Clarification of Murphy's Law. "Things only ever go right so that they may go more spectacularly wrong later." From this principle, all of life and physics may be deduced.