From: Mathieu Bouchard Date: 2001-05-08T05:53:43+09:00 Subject: [ruby-talk:14810] An Attempt at Versioning I have this prototype for versioning. Tell me what you think of it. The requiring file does this kind of thing: require("SomeFile") {|v| v >= [2,3] && v < [2,4] } and the required file does this kind of thing: require "Version"; version_is 5,1 which results in this kind of message: /net/home/projects/metaruby/lib/Version.rb:37:in `version_is': file Simulator, version [5, 1], is inappropriate according to "start.rb:5" (VersionError) And this is Version.rb: ----------------8<----------------cut-here----------------8<---------------- # $Id$ class Array; include Comparable; end if not Array < Comparable class VersionError < ScriptError def initialize(filename,version=nil,caller="requiring file") if version then super "file #{filename}, version #{version.inspect}, " \ "is inappropriate according to \"#{caller}\"" else super end end end module Kernel alias :require_old :require $require_stack = [] $require_versions = {} def require(filename,&proc) indent = " " * $require_stack.length printf "%srequire < %s\n", indent, filename if $require_verbose $require_stack.push [filename,proc,caller] if $require_versions.has_key? filename then if proc and not proc.call $require_versions[filename] then raise VersionError.new filename,version,me[2] end end require_old(filename) $require_stack.pop printf "%srequire > %s\n", indent, filename if $require_verbose end def version_is(*version) me = $require_stack[-1] if me and me[1] and not me[1].call *version then raise VersionError.new me[0],version,me[2] end if me then $require_versions[me[0]] = version end end end ----------------8<----------------cut-here----------------8<---------------- matju