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