class Admission::Status
Attributes
debug[RW]
person[R]
privileges[R]
rules[R]
Public Class Methods
new(person, privileges, rules, arbiter)
click to toggle source
# File lib/admission/status.rb, line 6 def initialize person, privileges, rules, arbiter @person = person @rules = rules @arbiter = arbiter @privileges = if privileges.nil? || privileges.empty? nil else # sort privileges # convenient as for arbitration doesn't have to switch between contexts too often grouped = privileges.inject Hash.new do |h, p| hash = p.context.hash rescue nil.hash (h[hash] ||= []) << p h end grouped.values.flatten.freeze end end
Public Instance Methods
allowed_in_contexts(*args)
click to toggle source
# File lib/admission/status.rb, line 55 def allowed_in_contexts *args return [] unless privileges arbitration = instantiate_arbitration *args privileges.reduce [] do |list, privilege| context = privilege.context unless list.include? context arbitration.prepare_sitting context list << context if arbitration.rule_per_privilege(privilege).eql? true end list end end
can?(*args)
click to toggle source
# File lib/admission/status.rb, line 27 def can? *args return false unless privileges process_request instantiate_arbitration(*args) end
cannot?(*args)
click to toggle source
# File lib/admission/status.rb, line 32 def cannot? *args !can?(*args) end
has?(sought)
click to toggle source
# File lib/admission/status.rb, line 44 def has? sought return false unless privileges list = sought.context ? privileges.select{|p| p.context == sought.context} : privileges list.any?{|p| p.eql_or_inherits? sought} end
instantiate_arbitration(*args)
click to toggle source
# File lib/admission/status.rb, line 51 def instantiate_arbitration *args @arbiter.new person, rules, *args end
request!(*args) { |exception| ... }
click to toggle source
# File lib/admission/status.rb, line 36 def request! *args can?(*args) || begin exception = Admission::Denied.new self, *args yield exception if block_given? raise exception end end
Private Instance Methods
process_request(arbitration)
click to toggle source
# File lib/admission/status.rb, line 73 def process_request arbitration ::Admission.debug_arbitration.call arbitration if ::Admission.debug_arbitration privileges.any? do |privilege| arbitration.prepare_sitting privilege.context arbitration.rule_per_privilege(privilege).eql? true end end