From d7587d76ff1366778bf8842ca6d8c911abfe0e19 Mon Sep 17 00:00:00 2001 From: Farley Knight Date: Sat, 2 Feb 2008 17:52:01 -0500 Subject: [PATCH] Fixes for Class#include and Class#extend to handle class variables * A module containing a class variable is accessible by the class either through Class#extend or Class#include --- kernel/core/module.rb | 7 +++---- spec/ruby/1.8/core/class/fixtures/classes.rb | 8 ++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/kernel/core/module.rb b/kernel/core/module.rb index 8583c23..9bbceb2 100644 --- a/kernel/core/module.rb +++ b/kernel/core/module.rb @@ -85,11 +85,10 @@ class Module def class_variable_get(name) name = verify_class_variable_name name - current = self - while current - vars = current.send :class_variables_table + viable_ancestors = (ancestors + metaclass.ancestors).flatten.uniq # Not sure exactly what order this should be in + viable_ancestors.each do |ancestor| + vars = ancestor.send :class_variables_table return vars[name] if vars.key? name - current = current.direct_superclass end raise NameError, "uninitialized class variable #{name} in #{self.name}" diff --git a/spec/ruby/1.8/core/class/fixtures/classes.rb b/spec/ruby/1.8/core/class/fixtures/classes.rb index 18e106e..cb4e715 100644 --- a/spec/ruby/1.8/core/class/fixtures/classes.rb +++ b/spec/ruby/1.8/core/class/fixtures/classes.rb @@ -32,4 +32,12 @@ module ClassSpecs super end end + + module ClassVariable + @@cvar = :cvar + + def cvar + @@cvar + end + end end -- 1.5.2.5