module Nashville::Media::ClassMethods

Public Instance Methods

Entity(entity) click to toggle source
# File lib/nashville/media.rb, line 10
def Entity(entity)
  delegator = self

  klass = Class.new(Hashie::Rash) do
    extend ClassMethods

    define_singleton_method(:entity) do
      return entity
    end

    define_singleton_method(:delegator) do
      return delegator
    end

    define_singleton_method(:media) do |*args|
      media = args.first
      if class_variable_defined?(:@@media)
        class_variable_get(:@@media)
      elsif media
        class_variable_set(:@@media, media)
      else
        self.delegator.media
      end
    end

    define_singleton_method(:attributes) do |*args|
      attributes = args
      if class_variable_defined?(:@@attributes)
        class_variable_get(:@@attributes)
      elsif attributes and not attributes.empty?
        class_variable_set(:@@attributes, attributes.collect(&:to_sym))
      else
        self.delegator.attributes
      end
    end

    define_singleton_method(:search) do |params|
      unless params[:term]
        attribute, *additional = params.keys.collect(&:to_sym) & self.attributes
        if not attribute
          raise ArgumentError, "Missing search criteria, specify one of #{self.attributes}"
        elsif not additional.empty?
          raise ArgumentError, "Too many search criteria specified (#{attributes})"
        else
          params[:attribute] = "#{attribute}Term"
          params[:term] = params.delete(attribute)
        end
      end

      params[:media] ||= self.media
      params[:entity] ||= self.entity

      results = self.delegator.search(params)
      results.collect{|result| self.new(result.to_h)}
    end
  end
end