Jacob Fugal
10/27/2006 4:38:00 PM
On 10/27/06, matt neuburg <matt@tidbits.com> wrote:
> class BigGuy
> def setup
> @favorites = "bluto"
> end
> def initialize
> setup
> p @favorites
> end
> class MiddleGuy < BigGuy
> end
> def self.make_subclass(what)
> p = Proc.new {@favorites = what}
> MiddleGuy.send( :define_method, :setup, p )
> return MiddleGuy.clone
> end
> end
You can do away with the explicit "MiddleGuy" class and the clone
call, by just creating an anonymous class on each invocation:
class BigGuy
def setup
@favorites = "bluto"
end
def initialize
setup
p @favorites
end
def self.with_favorites(favorites)
Class.new(self) do
define_method(:setup) do
@favorites = favorites
end
end
end
end
And while we're at it, if the only purpose of the on-the-fly class was
for the subclass to inherit from, why not make the subclass *be* the
on-the-fly class:
LittleGuy = BigGuy.with_favorites('popeye')
DevilishGuy = BigGuy.with_favorites(666)
Then the following code produces the same output as yours above:
BigGuy.new #=> "bluto"
LittleGuy.new #=> "popeye"
BigGuy.new #=> "bluto"
DevilishGuy.new #=> 666
LittleGuy.new #=> "popeye"
Jacob Fugal