From: Intransition Date: 2010-12-13T22:00:55+09:00 Subject: Re: VERSION constant issue On Nov 25, 12:54 pm, Josh Cheek wrote: > On Thu, Nov 25, 2010 at 7:54 AM, Intransition wrote: > > Ruby's VERSION constant is getting in the way of using #const_missing > > in my module. Here's some example code: > > >  module Foo > >    def self.const_data > >      @const_data ||= { 'version' => '1.0.0' } > >    end > > >    def self.const_missing(name) > >      key = name.to_s.downcase > >      const_data[key] || super(name) > >    end > >  end > > >  Foo::VERSION  #=> '1.8.7' > > > How can I fix this? > > > I tried `remove_const(:VERSION)` at the toplevel but discovered that > > some Ruby library don't like that (sorry, can't recall which it was > > off hand). > > Here are my results. > > module Foo >   def self.const_data >     @const_data ||= { 'version' => '1.0.0' } >   end > >   def self.const_missing(name) >     key = name.to_s.downcase >     const_data[key] || super(name) >   end > >   VERSION       # => "1.8.7" >   self::VERSION # => "1.0.0" > >   def self.method >     VERSION     # => "1.8.7" >   end >   method > end > > # going back through ruby versions > # I wasn't able to get these to print > # the ruby version until 1.7.1 > # thanks, ruby-versions.net :) > Foo::VERSION # => "1.0.0" > Foo::VERSION # => "1.0.0" Hmmm... I haven't been able to quite get the rhyme or reason of the behavior, but I just got the error again. The code is: class TracePoint # Access to metadata. def self.metadata @metadata ||= ( require 'yaml' YAML.load(File.new(File.dirname(__FILE__) + '/ tracepoint.yml')) ) end # Access metadata as constants. def self.const_missing(name) name = name.to_s metadata[name] || super(name) end When I use run: require 'tracepoint' TracePoint::VERSION I get: tryit.rb:2: warning: toplevel constant VERSION referenced by TracePoint::VERSION "1.8.7" I got this on both: ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux] ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux] Ruby 1.9.2 is not a problem.