lib/nenv/environment.rb in nenv-0.2.0 vs lib/nenv/environment.rb in nenv-0.3.0

- old
+ new

@@ -20,39 +20,62 @@ def initialize(namespace = nil) @namespace = (namespace ? namespace.upcase : nil) end - def self.create_method(meth, &block) - _create_env_method(self, meth, &block) - end - def create_method(meth, &block) - self.class._create_env_method(class << self; self; end, meth, &block) + self.class._create_env_accessor(singleton_class, meth, &block) end private def _sanitize(meth) meth.to_s[/^([^=?]*)[=?]?$/, 1].upcase end - def self._create_env_method(instance, meth, &block) - _fail_if_exists(instance, meth) + def _namespaced_sanitize(meth) + [@namespace, _sanitize(meth)].compact.join('_') + end - instance.send(:define_method, meth) do |*args| - env_name = [@namespace, _sanitize(meth)].compact.join('_') + class << self + def create_method(meth, &block) + _create_env_accessor(self, meth, &block) + end - if args.size == 1 - raw_value = args.first - ENV[env_name] = Dumper.new.dump(raw_value, &block) + def _create_env_accessor(klass, meth, &block) + _fail_if_accessor_exists(klass, meth) + + if meth.to_s.end_with? '=' + _create_env_writer(klass, meth, &block) else - Loader.new(meth).load(ENV[env_name], &block) + _create_env_reader(klass, meth, &block) end end - end - def self._fail_if_exists(instance, meth) - fail(AlreadyExistsError, meth) if instance.instance_methods.include?(meth) + private + + def _create_env_writer(klass, meth, &block) + env_name = nil + dumper = nil + klass.send(:define_method, meth) do |raw_value| + env_name ||= _namespaced_sanitize(meth) + dumper ||= Dumper.setup(&block) + ENV[env_name] = dumper.(raw_value) + end + end + + def _create_env_reader(klass, meth, &block) + env_name = nil + loader = nil + klass.send(:define_method, meth) do + env_name ||= _namespaced_sanitize(meth) + loader ||= Loader.setup(meth, &block) + loader.(ENV[env_name]) + end + end + + def _fail_if_accessor_exists(klass, meth) + fail(AlreadyExistsError, meth) if klass.method_defined?(meth) + end end end end