module Post class AnonymousAbilities include Kan::Abilities role(:anonymous) do |user, _| user.id.nil? end register(:read) { [] } end class BaseAbilities include Kan::Abilities role(:all) do |_, _| !!user.id end register(:read) { |user, repo| repo.all_with_limit(user) } end class PayedUserAbilities include Kan::Abilities role(:author) do |user, post| !!user.id and user.payed end register(:read) { |user, repo| repo.all(user) } end end abilities = Kan::Application.new( post: [Post::AnonymousAbilities.new, Post::BaseAbilities.new, Post::PayedUserAbilities.new] ) abilities['post.read'].call(anonymous, post) # => [] abilities['post.read'].call(regular, post) # => [5 items] abilities['post.read'].call(payed, post) # => [all items]