surrounded 0.8.4 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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