class NiftyScope::Scope

Public Class Methods

new(scope, params, options) click to toggle source
# File lib/nifty_scope/scope.rb, line 5
def initialize(scope, params, options)
  @scope = scope
  @mapping = options[:mapping] || {}
  @params = filter(params, options)
end

Public Instance Methods

apply() click to toggle source
# File lib/nifty_scope/scope.rb, line 11
def apply
  @params.each do |key, value|
    scope_method = scope_method_for(key.to_sym)
    ensure_scope_responds_to(scope_method)

    @scope = eval_scope(scope_method, value)
  end

  @scope
end

Private Instance Methods

ensure_scope_responds_to(method) click to toggle source
# File lib/nifty_scope/scope.rb, line 46
def ensure_scope_responds_to(method)
  if method.is_a?(Symbol) && !@scope.respond_to?(method)
    raise IrresponsibleScope, "#{@scope.name} can't respond to ##{method} method"
  end
end
eval_scope(method, args) click to toggle source
# File lib/nifty_scope/scope.rb, line 24
def eval_scope(method, args)
  if method.is_a?(Proc)
    if method.arity > 0
      @scope.instance_exec(*args, &method)
    elsif args
      @scope.instance_exec(&method)
    else
      @scope
    end
  else
    @scope.send(method, *scope_args(args))
  end
end
filter(params, options) click to toggle source
# File lib/nifty_scope/scope.rb, line 52
def filter(params, options)
  return params.slice(*options[:only])    if options.has_key?(:only)
  return params.except(*options[:except]) if options.has_key?(:except)
  params
end
scope_args(*args) click to toggle source
# File lib/nifty_scope/scope.rb, line 38
def scope_args(*args)
  args.delete_if { |arg| !!arg == arg }
end
scope_method_for(key) click to toggle source
# File lib/nifty_scope/scope.rb, line 42
def scope_method_for(key)
  @mapping[key] || key
end