class Grognard::Guard

Attributes

can_dos[R]
current_abilities[R]

Public Class Methods

new(*arr_roles, hash_roles: {}) click to toggle source
# File lib/grognard/guard.rb, line 9
def initialize(*arr_roles, hash_roles: {})
  @can_dos = {}
  @current_abilities = nil

  insert_array_roles(arr_roles) ||
    insert_hash_roles(hash_roles)
end

Public Instance Methods

<<(object) click to toggle source
# File lib/grognard/guard.rb, line 30
def <<(object)
  add_role(object.name.underscore, object)
  self
end
abilities_defined!(object) click to toggle source
# File lib/grognard/guard.rb, line 43
def abilities_defined!(object)
  abilities_defined?(object) ||
    raise_no_such_abilites
end
abilities_defined?(object) click to toggle source
# File lib/grognard/guard.rb, line 39
def abilities_defined?(object)
  object.respond_to?(:allowed_to)
end
add_role(name, object) click to toggle source
# File lib/grognard/guard.rb, line 22
def add_role(name, object)
  @can_dos[name.to_sym] = object if abilities_defined!(object)
end
be_a(name) click to toggle source
# File lib/grognard/guard.rb, line 17
def be_a(name)
  @current_abilities = @can_dos[name.to_sym] if role_defined! name
  self
end
can?(action, object, subject) click to toggle source
# File lib/grognard/guard.rb, line 35
def can?(action, object, subject)
  @current_abilities.allowed_to(object, subject).include? action
end
method_missing(meth, *args, &block) click to toggle source
Calls superclass method
# File lib/grognard/guard.rb, line 56
def method_missing(meth, *args, &block)
  meth = meth.to_s
  case
  when meth.match(/^be_a_(\w+)/)
    be_a($1, *args, &block)
  when meth.match(/^can_be_a_(\w+)?/)
    can_be_a?($1, *args, &block)
  when meth.match(/^can_(\w+)?/)
    can?($1.to_sym, *args, &block)
  else
    super
  end
end
remove_role(name) click to toggle source
# File lib/grognard/guard.rb, line 26
def remove_role(name)
  @can_dos.delete name.to_sym
end
respond_to?(meth, include_private = false) click to toggle source
Calls superclass method
# File lib/grognard/guard.rb, line 70
def respond_to?(meth, include_private = false)
  meth.to_s.start_with?("be_a_") ||
    meth.to_s.start_with?("can_") ||
    super
end
role_defined!(name) click to toggle source
# File lib/grognard/guard.rb, line 52
def role_defined!(name)
  role_defined?(name) || raise_no_such_role
end
role_defined?(name) click to toggle source
# File lib/grognard/guard.rb, line 48
def role_defined?(name)
  @can_dos.key?(name.to_sym)
end
Also aliased as: can_be_a?

Protected Instance Methods

raise_no_such_abilites() click to toggle source
# File lib/grognard/guard.rb, line 78
def raise_no_such_abilites
  fail AbilitiesNotDefinedError.new
end
raise_no_such_role() click to toggle source
# File lib/grognard/guard.rb, line 82
def raise_no_such_role
  fail RoleNotDefinedError.new
end

Private Instance Methods

can_be_a?(name)
Alias for: role_defined?
insert_array_roles(roles) click to toggle source
# File lib/grognard/guard.rb, line 88
def insert_array_roles(roles)
  return unless roles.kind_of? Array
  roles.each do |role|
    add_role(role.name.underscore, role)
  end
end
insert_hash_roles(roles) click to toggle source
# File lib/grognard/guard.rb, line 95
def insert_hash_roles(roles)
  return unless roles.kind_of? Hash
  roles.each do |key, role|
    add_role(key, role)
  end
end