lib/fattr.rb in fattr-1.0.2 vs lib/fattr.rb in fattr-1.0.3

- old
+ new

@@ -1,7 +1,7 @@ module Fattr - Fattr::VERSION = '1.0.2' unless Fattr.const_defined?(:VERSION) + Fattr::VERSION = '1.0.3' unless Fattr.const_defined?(:VERSION) def self.version() Fattr::VERSION end class List < ::Array def << element super @@ -46,42 +46,54 @@ Object.instance_method('instance_eval').bind(this).call &initialize end initializer_id = initializer.object_id __fattrs__.initializers[name] = initializer + compile = lambda do |code| + begin + module_eval code + rescue SyntaxError + raise SyntaxError, "\n#{ code }\n" + end + end + # setter, block invocation caches block - module_eval <<-code + code = <<-code def #{ name }=(*value, &block) value.unshift block if block @#{ name } = value.first end code + compile[code] # getter, providing a value or block causes it to acts as setter - module_eval <<-code + code = <<-code def #{ name }(*value, &block) value.unshift block if block return self.send('#{ name }=', value.first) unless value.empty? #{ name }! unless defined? @#{ name } @#{ name } end code + compile[code] # bang method re-calls any initializer given at declaration time - module_eval <<-code + code = <<-code def #{ name }! initializer = ObjectSpace._id2ref #{ initializer_id } self.#{ name } = initializer.call(self) @#{ name } end code + compile[code] # query simply defers to getter - cast to bool - module_eval <<-code + code = <<-code def #{ name }? - #{ name } + self.#{ name } end code + compile[code] fattrs << name returned[name] = initializer end