8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
# File 'lib/easy_roles.rb', line 8
def easy_roles(name, options = {})
options[:method] ||= :serialize
if options[:method] == :serialize
serialize name.to_sym, Array
respond_to?(:before_validation_on_create) ? before_validation_on_create(:make_default_roles) : before_validation(:make_default_roles, :on => :create)
class_eval " def has_role?(role)\n \#{name}.include?(role)\n end\n\n def add_role(role)\n clear_roles if self.\#{name}.nil?\n has_role?(role) ? false : self.\#{name} << role\n end\n \n def add_role!(role)\n add_role(role)\n self.save!\n end\n\n def remove_role(role)\n self.\#{name}.delete(role)\n end\n \n def remove_role!(role)\n remove_role(role)\n self.save!\n end\n \n def clear_roles\n self.\#{name} = []\n end\n \n def make_default_roles\n clear_roles if \#{name}.nil?\n end\n \n private :make_default_roles\n EOC\n elsif options[:method] == :bitmask\n \n def_name = (name == :roles) ? :easy_roles : :roles\n \n class_eval <<-EOC\n def self.list_roles\n \#{name.to_s.upcase}\n end\n \n def \#{def_name}=(roles)\n self.\#{name} = (roles & \#{name.to_s.upcase}).map { |r| 2**\#{name.to_s.upcase}.index(r) }.sum\n end\n\n def \#{def_name}\n \#{name.to_s.upcase}.reject { |r| ((\#{name} || 0) & 2**\#{name.to_s.upcase}.index(r)).zero? }\n end\n \n def has_role?(role)\n \#{def_name}.include?(role)\n end\n \n def add_role(role)\n new_roles = \#{def_name}.push(role).uniq\n self.\#{def_name} = new_roles\n end\n \n def add_role!(role)\n add_role(role)\n self.save!\n end\n \n def remove_role(role)\n new_roles = \#{def_name}\n new_roles.delete(role)\n self.\#{def_name} = new_roles\n end\n \n def remove_role!(role)\n remove_role(role)\n self.save!\n end\n \n def clear_roles\n self.\#{name} = 0\n end\n \n def clear_roles!\n self.\#{name} = 0\n self.save!\n end\n EOC\n end\nend\n"
|