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