module Zen::Service::Plugins::Policies
Constants
- GuardViolationError
Public Class Methods
used(service_class, *)
click to toggle source
# File lib/zen/service/plugins/policies.rb, line 10 def self.used(service_class, *) service_class.partials = [] end
Public Instance Methods
can?(action)
click to toggle source
# File lib/zen/service/plugins/policies.rb, line 25 def can?(action) why_cant?(action).nil? end
guard!(action)
click to toggle source
# File lib/zen/service/plugins/policies.rb, line 29 def guard!(action) reason = why_cant?(action) return if reason.nil? raise(reason) if (reason.is_a?(Class) ? reason : reason.class) < Exception raise(GuardViolationError, reason) end
why_cant?(action)
click to toggle source
# File lib/zen/service/plugins/policies.rb, line 39 def why_cant?(action) action_check = "#{action}?" reason = partials .find { |p| p.respond_to?(action_check) && !p.public_send(action_check) } &.class &.denial_reason reason.is_a?(Proc) ? instance_exec(&reason) : reason end
Private Instance Methods
execute!()
click to toggle source
# File lib/zen/service/plugins/policies.rb, line 14 def execute! partials.each_with_object({}) do |partial, permissions| partial.public_methods(false).grep(/\?$/).each do |action_check| key = action_check.to_s[0...-1] can = partial.public_send(action_check) permissions[key] = permissions.key?(key) ? permissions[key] && can : can end end end
partials()
click to toggle source
# File lib/zen/service/plugins/policies.rb, line 51 def partials @partials ||= self.class.partials.map do |klass| klass.from(self) end end