lib/makers/maker.rb in makers-0.1.3 vs lib/makers/maker.rb in makers-0.2.0

- old
+ new

@@ -1,113 +1,64 @@ module Makers class Maker - attr_reader :options, :proxy + attr_reader :options, :assignments, :object - def initialize(name, options={}, &block) - @name = name + def initialize(options, assignments) @options = options - @block = block - @loaded = false - Fetcher.new(name, options, &block) + @assignments = assignments + @object = build_object end - def parent - @parent ||= begin - if @options[:parent] - Makers.definitions.find(@options[:parent]) - end - end - end - - def attributes_for(options={}) - {}.tap do |hash| - iterate_attributes(options, proxy) do |name, value| - hash[name] = value - end - end - end - %w(build create).each do |name| define_method name do |*args| options = args.extract_options! - single_name = :"#{name}_one" + action = :"#{name}_one" if args.any? - [].tap do |list| - args.first.times do - list << send(single_name, options) - end + collection = [] + args.first.times do + collection << send(action, options) end + collection else - send(single_name, options) + send action, options end end end - %w(options attributes_for build create).each do |name| - define_method :"#{name}_with_load" do |*args| - load - send :"#{name}_without_load", *args + def attributes + hash = {} + if options.has_key?(:parent) + hash.merge! Makers.definitions.find(options[:parent]).attributes end - alias_method_chain name, :load - end - - protected - - def load - unless @loaded - if parent - @options = parent.options.merge(@options) - end - unless @options[:class] ||= @name.to_s.classify.constantize - raise "Class not found for maker #{@name}" - end - @proxy = Proxy.new(self, &@block) - @loaded = true + assignments.keys.each do |name| + hash[name] = object.send(name) end + hash end - def build_one(options={}) - @options[:class].new.tap do |instance| - trigger :before_build, instance - iterate_attributes(options, instance) do |name, value| - instance.send :"#{name}=", value - end - trigger :after_build, instance - end - end + private - def create_one(options={}) - build_one(options).tap do |instance| - trigger :before_create, instance - if instance.save - Makers.records << instance - end - trigger :after_create, instance + def build_one(overrides={}) + instance = options[:class_name].constantize.new + attributes.merge(overrides).each do |name, value| + instance.send "#{name}=", value end + instance end - def trigger(name, instance) - globals = (Makers.configuration.callbacks[name] || []) - locals = (proxy.callbacks[name] || []) - (globals + locals).each do |callback| - callback.call instance - end + def create_one(overrides={}) + instance = build_one(overrides) + instance.save + instance end - def iterate_attributes(options={}, context) - proxy.attributes.merge(options).each do |name, value| - case value - when Proc - context.instance_eval &value - when Sequence - value.generate context - else - value - end.tap do |value| - yield name, value - end + def build_object + klass = Class.new + assignments.each do |name, logic| + klass.send :define_method, name, &logic end + klass.new end end end