surrounded 0.8.4 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ console.log('This would be the main JS file.');
@@ -0,0 +1,17 @@
1
+ var metas = document.getElementsByTagName('meta');
2
+ var i;
3
+ if (navigator.userAgent.match(/iPhone/i)) {
4
+ for (i=0; i<metas.length; i++) {
5
+ if (metas[i].name == "viewport") {
6
+ metas[i].content = "width=device-width, minimum-scale=1.0, maximum-scale=1.0";
7
+ }
8
+ }
9
+ document.addEventListener("gesturestart", gestureStart, false);
10
+ }
11
+ function gestureStart() {
12
+ for (i=0; i<metas.length; i++) {
13
+ if (metas[i].name == "viewport") {
14
+ metas[i].content = "width=device-width, minimum-scale=0.25, maximum-scale=1.6";
15
+ }
16
+ }
17
+ }
@@ -33,10 +33,10 @@ module Surrounded
33
33
  mod.class_eval {
34
34
  define_method "disallow_#{name}?" do
35
35
  begin
36
- apply_roles if __apply_role_policy == :trigger
36
+ apply_behaviors
37
37
  instance_exec(&block)
38
38
  ensure
39
- remove_roles if __apply_role_policy == :trigger
39
+ remove_behaviors
40
40
  end
41
41
  end
42
42
  }
@@ -58,6 +58,18 @@ module Surrounded
58
58
  !self.respond_to?(method_restrictor, true) || !self.send(method_restrictor)
59
59
  }.to_set
60
60
  end
61
+
62
+ # Ask if the context will allow access to a trigger given the current players.
63
+ def allow?(name)
64
+ unless self.respond_to?(name)
65
+ raise NoMethodError, %{undefined method `#{name}' for #{self.inspect}}
66
+ end
67
+ if self.respond_to?("disallow_#{name}?")
68
+ !self.public_send("disallow_#{name}?")
69
+ else
70
+ true
71
+ end
72
+ end
61
73
  end
62
74
  end
63
75
  end
@@ -2,6 +2,7 @@ require 'set'
2
2
  require 'surrounded/context/role_map'
3
3
  require 'surrounded/context/role_builders'
4
4
  require 'surrounded/context/initializing'
5
+ require 'surrounded/context/trigger_controls'
5
6
  require 'surrounded/access_control'
6
7
  require 'surrounded/shortcuts'
7
8
  require 'surrounded/east_oriented'
@@ -15,18 +16,18 @@ require 'surrounded/east_oriented'
15
16
  module Surrounded
16
17
  module Context
17
18
  def self.extended(base)
18
- base.extend RoleBuilders, Initializing
19
19
  base.class_eval {
20
+ extend RoleBuilders, Initializing
21
+
20
22
  @triggers = Set.new
21
23
  include InstanceMethods
22
- }
23
- end
24
24
 
25
- # Provides a Set of all available trigger methods where
26
- # behaviors will be applied to the roles before execution
27
- # and removed afterward.
28
- def triggers
29
- @triggers.dup
25
+ trigger_mod = Module.new
26
+ const_set('TriggerMethods', trigger_mod)
27
+ include trigger_mod
28
+
29
+ extend TriggerControls
30
+ }
30
31
  end
31
32
 
32
33
  private
@@ -39,15 +40,6 @@ module Surrounded
39
40
  class << self
40
41
  attr_writer :default_role_type
41
42
  end
42
-
43
- # Provide the ability to create access control methods for your triggers.
44
- def protect_triggers; self.extend(::Surrounded::AccessControl); end
45
-
46
- # Automatically create class methods for each trigger method.
47
- def shortcut_triggers; self.extend(::Surrounded::Shortcuts); end
48
-
49
- # Automatically return the context object from trigger methods.
50
- def east_oriented_triggers; self.extend(::Surrounded::EastOriented); end
51
43
 
52
44
  def default_role_type
53
45
  @default_role_type ||= Surrounded::Context.default_role_type
@@ -57,87 +49,25 @@ module Surrounded
57
49
  def default_role_type=(type)
58
50
  @default_role_type = type
59
51
  end
60
-
61
- # Set the time to apply roles to objects. Either :trigger or :initialize.
62
- # Defaults to :trigger
63
- def apply_roles_on(which)
64
- @__apply_role_policy = which
65
- end
66
-
67
- def __apply_role_policy
68
- @__apply_role_policy ||= :trigger
69
- end
70
-
71
- # Creates a context instance method which will apply behaviors to role players
72
- # before execution and remove the behaviors after execution.
73
- #
74
- # Alternatively you may define your own methods then declare them as triggers
75
- # afterward.
76
- #
77
- # Example:
78
- # trigger :some_event do
79
- # # code here
80
- # end
81
- #
82
- # def some_event
83
- # # code here
84
- # end
85
- # trigger :some_event
86
- #
87
- def trigger(*names, &block)
88
- if block.nil?
89
- names.each do |name|
90
- convert_method_to_trigger(name)
91
- end
92
- else
93
- name = names.first
94
- define_method(name, &block)
95
- convert_method_to_trigger(name)
96
- end
97
- end
98
-
99
- def store_trigger(*names)
100
- @triggers.merge(names)
101
- end
102
52
 
103
- def convert_method_to_trigger(name)
104
- unless triggers.include?(name) || name.nil?
105
- alias_method :"__trigger_#{name}", :"#{name}"
106
- private :"__trigger_#{name}"
107
- remove_method :"#{name}"
108
- define_trigger_wrap_method(name)
109
- store_trigger(name)
110
- end
111
- end
53
+ # Provide the ability to create access control methods for your triggers.
54
+ def protect_triggers; self.extend(::Surrounded::AccessControl); end
112
55
 
113
- def define_trigger_wrap_method(name)
114
- mod = Module.new
115
- line = __LINE__
116
- mod.class_eval %{
117
- def #{name}(*args, &block)
118
- begin
119
- apply_roles if __apply_role_policy == :trigger
56
+ # Automatically create class methods for each trigger method.
57
+ def shortcut_triggers; self.extend(::Surrounded::Shortcuts); end
120
58
 
121
- #{trigger_return_content(name)}
59
+ # Automatically return the context object from trigger methods.
60
+ def east_oriented_triggers; self.extend(::Surrounded::EastOriented); end
122
61
 
123
- ensure
124
- remove_roles if __apply_role_policy == :trigger
125
- end
126
- end
127
- }, __FILE__, line
128
- const_set("SurroundedTrigger#{name.to_s.upcase.sub(/\?\z/,'Query')}", mod)
129
- include mod
130
- end
131
-
132
- def trigger_return_content(name, *args, &block)
133
- %{self.send("__trigger_#{name}", *args, &block)}
134
- end
135
-
136
62
  # === Utility shortcuts
63
+
64
+ def role_const_defined?(name)
65
+ const_defined?(name, false)
66
+ end
137
67
 
138
68
  # Set a named constant and make it private
139
69
  def private_const_set(name, const)
140
- unless self.const_defined?(name, false)
70
+ unless role_const_defined?(name)
141
71
  const = const_set(name, const)
142
72
  private_constant name.to_sym
143
73
  end
@@ -157,10 +87,6 @@ module Surrounded
157
87
  end
158
88
  end
159
89
 
160
- def role_const_defined?(name)
161
- const_defined?(name, false)
162
- end
163
-
164
90
  module InstanceMethods
165
91
  # Check whether a given name is a role inside the context.
166
92
  # The provided block is used to evaluate whether or not the caller
@@ -183,14 +109,6 @@ module Surrounded
183
109
 
184
110
  private
185
111
 
186
- def preinitialize
187
- @__apply_role_policy = self.class.send(:__apply_role_policy)
188
- end
189
-
190
- def postinitialize
191
- apply_roles if __apply_role_policy == :initialize
192
- end
193
-
194
112
  def role_map
195
113
  @role_map ||= RoleMap.new
196
114
  end
@@ -221,59 +139,65 @@ module Surrounded
221
139
  role_map.update(role, role_module_basename(mod_name), object)
222
140
  end
223
141
 
224
- def __apply_role_policy
225
- @__apply_role_policy
226
- end
227
-
228
- def add_interface(role, behavior, object)
142
+ def apply_behavior(role, behavior, object)
229
143
  if behavior && role_const_defined?(behavior)
230
- applicator = role_const(behavior).is_a?(Class) ? method(:add_class_interface) : method(:add_module_interface)
231
-
232
- role_player = applicator.call(object, role_const(behavior))
144
+ applicator = if self.respond_to?("apply_behavior_#{role}")
145
+ method("apply_behavior_#{role}")
146
+ elsif role_const(behavior).is_a?(Class)
147
+ method(:apply_class_behavior)
148
+ else
149
+ method(:apply_module_behavior)
150
+ end
151
+
152
+ role_player = applicator.call(role_const(behavior), object)
233
153
  map_role(role, behavior, role_player)
234
154
  end
235
155
  role_player || object
236
156
  end
237
157
 
238
- def add_module_interface(obj, mod)
158
+ def apply_module_behavior(mod, obj)
239
159
  adder_name = module_extension_methods.find{|meth| obj.respond_to?(meth) }
240
- return obj if !adder_name
160
+ return obj unless adder_name
241
161
 
242
162
  obj.method(adder_name).call(mod)
243
163
  obj
244
164
  end
245
165
 
246
- def add_class_interface(obj, klass)
166
+ def apply_class_behavior(klass, obj)
247
167
  wrapper_name = wrap_methods.find{|meth| klass.respond_to?(meth) }
248
168
  return obj if !wrapper_name
249
169
  klass.method(wrapper_name).call(obj)
250
170
  end
251
-
252
- def remove_interface(role, behavior, object)
171
+
172
+ def remove_behavior(role, behavior, object)
253
173
  if behavior && role_const_defined?(behavior)
254
- remover_name = (module_removal_methods + unwrap_methods).find{|meth| object.respond_to?(meth) }
174
+ remover_name = (module_removal_methods + unwrap_methods).find do |meth|
175
+ object.respond_to?(meth)
176
+ end
255
177
  end
256
178
 
257
- if remover_name
258
- role_player = object.send(remover_name)
259
- end
179
+ role_player = if self.respond_to?("remove_behavior_#{role}")
180
+ self.send("remove_behavior_#{role}", role_const(behavior), object)
181
+ elsif remover_name
182
+ object.send(remover_name)
183
+ end
260
184
 
261
185
  role_player || object
262
186
  end
263
187
 
264
- def apply_roles
188
+ def apply_behaviors
265
189
  role_map.each do |role, mod_name, object|
266
- player = add_interface(role, mod_name, object)
190
+ player = apply_behavior(role, mod_name, object)
267
191
  player.send(:store_context, self) do; end
268
192
  end
269
193
  end
270
194
 
271
- def remove_roles
195
+ def remove_behaviors
272
196
  role_map.each do |role, mod_name, player|
273
197
  if player.respond_to?(:remove_context, true)
274
198
  player.send(:remove_context) do; end
275
199
  end
276
- remove_interface(role, mod_name, player)
200
+ remove_behavior(role, mod_name, player)
277
201
  end
278
202
  end
279
203
 
@@ -3,9 +3,7 @@ module Surrounded
3
3
  module Initializing
4
4
  def new(*args, &block)
5
5
  instance = allocate
6
- instance.send(:preinitialize)
7
6
  instance.send(:initialize, *args, &block)
8
- instance.send(:postinitialize)
9
7
  instance
10
8
  end
11
9
 
@@ -18,11 +16,9 @@ module Surrounded
18
16
  line = __LINE__
19
17
  mod.class_eval "
20
18
  def initialize(#{setup_args.join(',')})
21
- preinitialize
22
19
  arguments = method(__method__).parameters.map{|arg| eval(arg[1].to_s) }
23
20
  @role_map = RoleMap.new
24
21
  map_roles(#{setup_args}.zip(arguments))
25
- postinitialize
26
22
  end
27
23
  ", __FILE__, line
28
24
  const_set("ContextInitializer", mod)
@@ -1,17 +1,3 @@
1
- # Some features are only available in versions of Ruby
2
- # where this method is true
3
- unless defined?(module_method_rebinding?)
4
- def module_method_rebinding?
5
- return @__module_method_rebinding__ if defined?(@__module_method_rebinding__)
6
- sample_method = Enumerable.instance_method(:to_a)
7
- @__module_method_rebinding__ = begin
8
- !!sample_method.bind(Object.new)
9
- rescue TypeError
10
- false
11
- end
12
- end
13
- end
14
-
15
1
  module Surrounded
16
2
  module Context
17
3
  module RoleBuilders
@@ -43,19 +29,17 @@ module Surrounded
43
29
  alias_method :wrapper, :wrap
44
30
 
45
31
 
46
- if module_method_rebinding?
47
- # Create an object which will bind methods to the role player
48
- def interface(name, &block)
49
- class_basename = name.to_s.gsub(/(?:^|_)([a-z])/){ $1.upcase }
50
- interface_name = class_basename + 'Interface'
32
+ # Create an object which will bind methods to the role player
33
+ def interface(name, &block)
34
+ class_basename = name.to_s.gsub(/(?:^|_)([a-z])/){ $1.upcase }
35
+ interface_name = class_basename + 'Interface'
51
36
 
52
- behavior = private_const_set(interface_name, Module.new(&block))
37
+ behavior = private_const_set(interface_name, Module.new(&block))
53
38
 
54
- require 'surrounded/context/negotiator'
55
- undef_method(name)
56
- define_method(name) do
57
- instance_variable_set("@#{name}", Negotiator.new(role_map.assigned_player(name), behavior))
58
- end
39
+ require 'surrounded/context/negotiator'
40
+ undef_method(name)
41
+ define_method(name) do
42
+ instance_variable_set("@#{name}", Negotiator.new(role_map.assigned_player(name), behavior))
59
43
  end
60
44
  end
61
45
 
@@ -9,7 +9,7 @@ module Surrounded
9
9
 
10
10
  def role_player?(object)
11
11
  !values(object).empty?
12
- rescue ::Triad::ValueNotPresent
12
+ rescue ::Triad::ItemNotPresent
13
13
  false
14
14
  end
15
15
 
@@ -0,0 +1,91 @@
1
+ module Surrounded
2
+ module Context
3
+ module TriggerControls
4
+
5
+ # Provides a Set of all available trigger methods where
6
+ # behaviors will be applied to the roles before execution
7
+ # and removed afterward.
8
+ def triggers
9
+ @triggers.dup
10
+ end
11
+
12
+ def store_trigger(*names)
13
+ @triggers.merge(names)
14
+ end
15
+
16
+ # Creates a context instance method which will apply behaviors to role players
17
+ # before execution and remove the behaviors after execution.
18
+ #
19
+ # Alternatively you may define your own methods then declare them as triggers
20
+ # afterward.
21
+ #
22
+ # Example:
23
+ # trigger :some_event do
24
+ # # code here
25
+ # end
26
+ #
27
+ # def some_event
28
+ # # code here
29
+ # end
30
+ # trigger :some_event
31
+ #
32
+ def trigger(*names, &block)
33
+ if block.nil?
34
+ names.each do |name|
35
+ convert_method_to_trigger(name)
36
+ end
37
+ else
38
+ name = names.first
39
+ define_trigger_action(*names, &block)
40
+ define_trigger(name, &block)
41
+ store_trigger(name)
42
+ end
43
+ end
44
+
45
+ def convert_method_to_trigger(name)
46
+ unless triggers.include?(name) || name.nil?
47
+ alias_method :"__trigger_#{name}", :"#{name}"
48
+ private :"__trigger_#{name}"
49
+ remove_method :"#{name}"
50
+ define_trigger(name)
51
+ store_trigger(name)
52
+ end
53
+ end
54
+
55
+ def define_trigger(name)
56
+ line = __LINE__
57
+ self.class_eval %{
58
+ def #{name}(*args, &block)
59
+ begin
60
+ apply_behaviors
61
+
62
+ #{trigger_return_content(name)}
63
+
64
+ ensure
65
+ remove_behaviors
66
+ end
67
+ end
68
+ }, __FILE__, line
69
+ end
70
+
71
+ def trigger_return_content(name)
72
+ if method_defined?(name)
73
+ %{super}
74
+ else
75
+ %{self.send("__trigger_#{name}", *args, &block)}
76
+ end
77
+ end
78
+
79
+
80
+ def define_trigger_action(*name_and_args, &block)
81
+ trigger_action_module.module_eval do
82
+ define_method(*name_and_args, &block)
83
+ end
84
+ end
85
+
86
+ def trigger_action_module
87
+ self.const_get('TriggerMethods', false)
88
+ end
89
+ end
90
+ end
91
+ end