Sha256: b0d9c70ca676384c933448d7a03bd84c64532fb11ef796b52a297cbe5d272bcd

Contents?: true

Size: 1.33 KB

Versions: 3

Compression:

Stored size: 1.33 KB

Contents

module Smoke
  # The "Joiner" source is a special source
  # that can be used to join multiple sources together
  # and proxy call dispatch for each source
  #
  # Usage:
  #   Smoke.join(:delicious, :twitter, :flickr) do
  #     path :photos, :photo
  #   end
  class Join < Origin # :nodoc: 
    def initialize(names, &block)
      @names = names
      super((names << "joined").join("_").to_sym, &block)
    end
    
    # Rename sources immediately after they've been joined together
    # Usage:
    #   Smoke.join(:delicious, :twitter, :flickr) do
    #     name :web_stream
    #   end
    def name(rename = nil)
      return @name if rename.nil?
      Smoke.rename(@name => rename)
    end
    
    def method_missing(symbol, *args, &block)
      ivar = "@#{symbol}"

      unless args.empty?
        sources.each do |source| 
          source.last.instance_variable_set(ivar, args.last)
        end
      end

      return self
    end
    
    protected
    def sources
      Smoke.active_sources.find_all{|k, v| @names.include?(k) }
    end
    
    def dispatch
      # Recall dispatch
      sources.each do |source|
        source.last.send(:prepare!)
        source.last.send(:dispatch) if source.last.respond_to?(:dispatch)
      end
      
      # Re-map items
      @items = sources.map {|source| source.last.items }.flatten
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
smoke-0.5.20 lib/smoke/source/join.rb
smoke-0.5.19 lib/smoke/source/join.rb
smoke-0.5.17 lib/smoke/source/join.rb