lib/rails_current.rb in rails_current-1.0.0 vs lib/rails_current.rb in rails_current-1.1.0
- old
+ new
@@ -1,32 +1,88 @@
-require 'fattr'
+require 'map'
module Current
- def Current.version() '1.0.0' end
+ def Current.version() '1.1.0' end
+ def Current.data
+ Thread.current[:current] ||= Map.new
+ end
+
+ def Current.clear
+ data.clear
+ self
+ end
+
+ def Current.reset
+ calls.keys.each{|name, block| undefine_attribute_method(name) }
+ data.clear
+ calls.clear
+ self
+ end
+
def Current.attribute(name, *args, &block)
+ options = Map.options_for(args)
+
name = name.to_s
- attribute_names.push(name) unless attribute?(name)
- Fattr(name, *args, &block)
+ default = options.has_key?(:default) ? options[:default] : args.shift
+
+ block ||= proc{ default }
+ calls[name] = block
+
+ define_attribute_method(name)
+ self
end
+ def Current.calls
+ @calls ||= Map.new
+ end
+
+ def Current.define_attribute_method(name)
+ unless respond_to?(name)
+ singleton_class.module_eval do
+ define_method(name) do
+ if data.has_key?(name)
+ data[name]
+ else
+ data[name] = calls[name].call
+ end
+ end
+
+ define_method(name + '=') do |value|
+ data[name] = value
+ end
+
+ define_method(name + '?') do |value|
+ data[name]
+ end
+ end
+ end
+ end
+
+ def Current.undefine_attribute_method(name)
+ if respond_to?(name)
+ singleton_class.module_eval do
+ remove_method(name)
+ remove_method(name + '=')
+ remove_method(name + '?')
+ end
+ end
+ end
+
+ def Current.singleton_class
+ @singleton_class ||= class << self; self; end
+ end
+
def Current.attribute?(name)
- attribute_names.include?(name.to_s)
+ calls.has_key?(name)
end
def Current.attribute_names
- @attribute_names ||= []
+ calls.keys
end
def Current.attributes
- attribute_names.inject({}){|hash, name| hash.update(name => send(name))}
- end
-
- def Current.clear
- attribute_names.each do |name|
- ivar = "@#{ name }"
- remove_instance_variable(ivar) if instance_variable_defined?(ivar)
- end
+ attribute_names.inject(Map.new){|map, name| map.update(name => send(name))}
end
def Current.method_missing(method, *args, &block)
case method.to_s
when /^(.*)[=]$/