Sha256: dd0396ce27f1f948514ad57a2fd3d8fa8967d8c2c2995e9a1e3c4abcbe87e226

Contents?: true

Size: 1.47 KB

Versions: 5

Compression:

Stored size: 1.47 KB

Contents

module Generator extend Trait
  
  def self.start klass, *args
    [:start_generating, klass, *args]
  end
  Start = :start_generating
  
  def self.included base
    base.extend ClassMethods
  end
  
  module ClassMethods
    
    def generates klass, options = {}
      self.send :include, InstanceMethods
      
      rate   = options[:every]
      til    = options[:until]
      offset = options[:starting_at]
      
      class_eval <<-GENERATION
def start_generating klass = #{klass.name}, every_rate = #{rate || 10}, til = #{til || false}, offset = #{offset || rate || 10}
  return if til && til <= 0
  threaded offset, &generation(klass, every_rate, til)
end
      GENERATION
      
      # If an offset is given, start generating after the offset, else after start_generating is called.
      #
      if offset
        InitializerHooks.register self do
          start_generating
        end
      end
      
    end
    
  end
  
  module InstanceMethods
    
    def destroyed!
      stop_generating!
    end
    
    def stop_generating!
      @stop_generating = true
    end
    
    def generation klass, every_rate, til
      return lambda {} if @stop_generating
      lambda do
        self.generate klass
        til = til - every_rate if til
        self.start_generating klass, every_rate, til, every_rate
      end
    end
    
    def generate klass
      generated = klass.new self.window
      generated.warp self.position
      self.window.register generated
    end
    
  end
  
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
gosu_extensions-0.2.5 lib/traits/generator.rb
gosu_extensions-0.2.4 lib/traits/generator.rb
gosu_extensions-0.2.3 lib/traits/generator.rb
gosu_extensions-0.2.2 lib/traits/generator.rb
gosu_extensions-0.2.1 lib/traits/generator.rb