Skip to content

Instantly share code, notes, and snippets.

@felipeelias
Created April 18, 2011 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save felipeelias/925425 to your computer and use it in GitHub Desktop.
Save felipeelias/925425 to your computer and use it in GitHub Desktop.
just wondering
require 'test/unit'
module RoleManagement
@@available_roles ||= []
def available_roles
@@available_roles
end
def roles
@roles ||= {}
end
def deny(action_name)
roles[action_name] = false
end
def allow(action_name)
roles[action_name] = true
end
def set_role(action_name)
available_roles << action_name
class_eval do
define_method "can_#{action_name}?" do
!!self.class.roles[action_name]
end
end
end
end
class RoleBase
extend RoleManagement
set_role :edit_user
set_role :create_user
end
class GuestRole < RoleBase
deny :edit_user
# deny :create_user => by default is denied
end
class AdminRole < RoleBase
allow :edit_user
allow :create_user
end
class GuestRoleTest < Test::Unit::TestCase
def setup
@guest = GuestRole.new
end
def test_for_default_role
assert !@guest.can_edit_user?
assert !@guest.can_create_user?
end
def test_for_role_names
assert_equal @guest.class.available_roles, [:edit_user, :create_user]
end
end
class AdminRoleTest < Test::Unit::TestCase
def setup
@admin = AdminRole.new
end
def test_for_default_role
assert @admin.can_edit_user?
assert @admin.can_create_user?
end
end
class User
def role
return GuestRole.new
end
end
p User.new.role.can_create_user?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment