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