#!/usr/bin/ruby -w class ToolBox def initialize(args = {}) @@class_stash ||= {} args.each_pair { |k, v| register_pair(k, v) } end def ToolBox.method_missing(sym, *args) sym_str = sym.to_s if sym_str.gsub!(/=\Z/xm, '').nil? warn 'warning: Class variable @@%s not initialized' % sym unless @@class_stash.has_key?(sym) return @@class_stash[sym] else @@class_stash[sym_str.to_sym] = args return nil end end def method_missing(sym, *args) sym_str = sym.to_s return sym_str.gsub!(/=\Z/xm, '').nil? ? self.instance_variable_get(make_instance_sym(sym)) : register_pair(sym_str, args) end private def make_instance_sym(k) return ('@%s' % k).to_sym end def register_pair(k, v) self.instance_variable_set(make_instance_sym(k), v) end end tb = ToolBox.new(:asdf => 'fff') puts tb.asdf puts tb.asdfg tb.asdfg = 'omg' puts tb.asdfg ToolBox.test = 'asdf;' puts ToolBox.test puts ToolBox.asdf