lib/spinning_wheel/fabric.rb in spinning_wheel-0.1.0 vs lib/spinning_wheel/fabric.rb in spinning_wheel-0.2.0
- old
+ new
@@ -4,32 +4,62 @@
attr_reader :name, :class_name
def initialize(name:, class_name:, &block)
@name = name
@class_name = class_name
- @attributes = {}
@block = block
end
def build
@klass = @class_name.constantize
- instance_eval(&@block)
+ attributes = DSL.run(@block)
parameters = @klass.instance_method(:initialize).parameters
required_parametes = []
parameters.each do |parameter|
if parameter[0] == :req
required_parametes << parameter[1]
end
end
- if required_parametes == @attributes.keys
- @klass.new(*@attributes.values)
+ if required_parametes == attributes.keys
+ @klass.new(*attributes.values)
else
- @klass.new(**@attributes)
+ @klass.new(**attributes)
end
end
- def method_missing(name, *args, &block)
- @attributes[name] = block.call
+
+ class DSL
+
+ attr_accessor :attributes
+
+ def self.run(block)
+ dsl = self.new
+ dsl.instance_eval(&block)
+ return dsl.attributes
+ end
+
+ def initialize()
+ @attributes = Hash.new
+ clean_up_object_methods()
+ end
+
+ def method_missing(name, *args, &block)
+ @attributes[name] = block.call
+ end
+
+ private
+
+ def clean_up_object_methods
+ self.instance_eval('undef :clone')
+ self.instance_eval('undef :display')
+ self.instance_eval('undef :dup')
+ self.instance_eval('undef :extend')
+ self.instance_eval('undef :freeze')
+ self.instance_eval('undef :frozen?')
+ self.instance_eval('undef :inspect')
+ self.instance_eval('undef :taint')
+ self.instance_eval('undef :tap')
+ end
end
end
end