├── .gitignore ├── CHANGELOG ├── README.markdown ├── Rakefile ├── doc └── rdoc │ ├── Object.html │ ├── RubyEvents.html │ ├── RubyEvents │ └── Events.html │ ├── created.rid │ ├── images │ ├── brick.png │ ├── brick_link.png │ ├── bug.png │ ├── bullet_black.png │ ├── bullet_toggle_minus.png │ ├── bullet_toggle_plus.png │ ├── date.png │ ├── find.png │ ├── loadingAnimation.gif │ ├── macFFBgHack.png │ ├── package.png │ ├── page_green.png │ ├── page_white_text.png │ ├── page_white_width.png │ ├── plugin.png │ ├── ruby.png │ ├── tag_green.png │ ├── wrench.png │ ├── wrench_orange.png │ └── zoom.png │ ├── index.html │ ├── js │ ├── darkfish.js │ ├── jquery.js │ ├── quicksearch.js │ └── thickbox-compressed.js │ ├── lib │ ├── ruby_events │ │ ├── core_rb.html │ │ └── object_patch_rb.html │ └── ruby_events_rb.html │ └── rdoc.css ├── lib ├── ruby_events.rb └── ruby_events │ ├── core.rb │ └── object_patch.rb ├── pkg ├── ruby_events-0.0.1.gem ├── ruby_events-0.0.2.gem ├── ruby_events-0.0.3.gem ├── ruby_events-0.0.4.gem ├── ruby_events-0.0.5.gem ├── ruby_events-0.0.6.gem ├── ruby_events-0.0.7.gem ├── ruby_events-0.0.8.gem ├── ruby_events-1.0.0.gem ├── ruby_events-1.0.1.gem ├── ruby_events-1.1.0.beta.gem ├── ruby_events-1.1.0.beta2.gem └── ruby_events-1.1.0.gem ├── ruby_events.gemspec └── spec └── ruby_events_spec.rb /.gitignore: -------------------------------------------------------------------------------- 1 | nbproject -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## v 1.1.1 - ? 4 | 5 | * Fixed depedency for RSpec to be the right version. 6 | * Migrated tests to RSpec 7 | * Lots of significant updates to README. 8 | * Regenerated docs, will be moving these to the GitHub wiki with the next 9 | release. 10 | 11 | ## v 1.1.0 - 17th June, 2011 12 | 13 | * :fire_on_method now takes an array of Symbols to attach to, so you can define 14 | handlers for multiple methods, including their aliases. 15 | * Refactored into a split Module - this allows you to require ruby_events/core 16 | to get the library without extending Object by default. 17 | * Added proper .gemspec, and cleaned up Rakefile of all bogus tasks. 18 | * Added proper dependencies to the .gemspec. 19 | * Adding MIT license for those who were asking about license restrictions. 20 | 21 | *** 22 | 23 | ## v 1.0.2 - 6th September, 2011 24 | 25 | * Updating docs. 26 | 27 | *** 28 | 29 | ## v 1.0.1 - 6th September, 2011 30 | 31 | * Fix for Enumerable detection that was causing exceptions for some people. 32 | 33 | *** 34 | 35 | ## v 1.0.0 - 6th September, 2011 36 | 37 | * Added proper spec tests in place of the original crappy tests that didn't 38 | really help with anything. 39 | * Cleanup of Rakefile to get rid of warnings and errors. 40 | * Adding comments and regerating docs. 41 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # RubyEvents 2 | 3 | Use RubyEvents to add event listening and firing capabilities to all Ruby 4 | objects. It's simple, fast and remains Ruby-ish in style and usage. 5 | 6 | A really simple event implementation that hooks into the Object class by 7 | default, or can be used to extend modules and classes. Now all your objects can 8 | join in the fun of firing events! RubyEvents even offers you callbacks on 9 | already defined methods, without having to do the hard work yourself - yes this 10 | means you can have callbacks on standard library methods without having to 11 | monkey patch! 12 | 13 | ## Installation 14 | 15 | ```shell 16 | gem install ruby_events 17 | ``` 18 | 19 | ## Usage 20 | 21 | Using ruby_events is simple 22 | 23 | ```ruby 24 | require 'rubygems' 25 | require 'ruby_events' 26 | ``` 27 | 28 | By default, all Objects are extended with a RubyEvents, and given a new method 29 | called `events`. You can also require RubyEvents without the Object patch: 30 | 31 | ```ruby 32 | require 'rubygems' 33 | require 'ruby_events/core' 34 | ``` 35 | 36 | This allows you to patch objects yourself, or apply the RubyEvents module 37 | however you like. 38 | 39 | ### Examples 40 | 41 | RubyEvents allows you to use events like callbacks, whether within your own 42 | classes, or by monkey patching others: 43 | 44 | ```ruby 45 | class Example 46 | def initialize 47 | events.listen(:test_event) do |event_data| 48 | puts 'Hai there!' 49 | puts event_data 50 | end 51 | end 52 | 53 | def call_me 54 | events.fire(:test_event, 'My name is Mr Test Man!') 55 | end 56 | end 57 | 58 | e = Example.new 59 | e.call_me # Fires the event, and our handler gets called! 60 | ``` 61 | 62 | You can do cooler and more advanced things, like add listeners to an Array: 63 | 64 | ```ruby 65 | a = [] 66 | 67 | class << a 68 | alias_method :inject_old, :inject 69 | 70 | def inject(item) 71 | events.fire(:injected, self, item) 72 | inject_old(item) 73 | end 74 | end 75 | 76 | a.events.listen(:injected) do |a, item| 77 | puts a 78 | puts item 79 | end 80 | 81 | a.inject('This is a test') 82 | ``` 83 | 84 | But because this is a fairly common pattern, RubyEvents does it for you with 85 | a little bit of sugar: 86 | 87 | ```ruby 88 | a = [] 89 | a.events.fire_on_method('<<'.to_sym, :item_injected) 90 | a.events.listen(:injected) do |event_data| 91 | puts event_data 92 | end 93 | 94 | a << 'this is a test' 95 | ``` 96 | 97 | You can supply multiple methods to fire a single event type on, useful for 98 | catching methods and their aliases: 99 | 100 | ```ruby 101 | a.events.fire_on_method(['<<'.to_sym, :push], :item_injected) 102 | ``` 103 | 104 | You can supply the `listen` method with a Proc, an array of Procs, or a block. 105 | You can also give it a mixute of Procs and a block if you really want: 106 | 107 | ```ruby 108 | a = [] 109 | a.events.fire_on_method('<<'.to_sym, :item_injected) 110 | a.events.listen(:injected, [Proc.new { |event_data| puts event_data; }, Proc.new { puts 'Hello, I was called!'; }]) 111 | 112 | a << 'this is a test' 113 | ``` 114 | 115 | These method events will automatically be passed the arguments that were passed 116 | to that method when it was called. Don't let your imagination stop there. You 117 | can add an event to any class method, and because all ruby objects are passed by 118 | reference, you can set these arguments and change the outcome of the function. 119 | Effectively, you can use the events as callbacks on any method: 120 | 121 | ```ruby 122 | a = {:one => 1} 123 | b = {:two => 3} 124 | 125 | a.events.fire_on_method(:merge, :merged) 126 | a.events.listen(:merged) do |items| 127 | items[:three] = 3 128 | puts 'The hash will have the extra item.' 129 | items 130 | end 131 | 132 | puts a.merge(b) 133 | ``` 134 | 135 | All RubyEvents functionality is just an `object.events` call away. 136 | 137 | ## Licence 138 | 139 | The MIT License 140 | 141 | Copyright (c) 2011 Nathan Kleyn 142 | 143 | Permission is hereby granted, free of charge, to any person obtaining a copy 144 | of this software and associated documentation files (the "Software"), to deal 145 | in the Software without restriction, including without limitation the rights 146 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 147 | copies of the Software, and to permit persons to whom the Software is 148 | furnished to do so, subject to the following conditions: 149 | 150 | The above copyright notice and this permission notice shall be included in 151 | all copies or substantial portions of the Software. 152 | 153 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 154 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 155 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 156 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 157 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 158 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 159 | THE SOFTWARE. 160 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | require 'rake' 3 | require 'rake/clean' 4 | require 'rdoc/task' 5 | require 'rspec/core/rake_task' 6 | 7 | RDoc::Task.new do |rdoc| 8 | files =['README.markdown', 'lib/**/*.rb'] 9 | rdoc.rdoc_files.add(files) 10 | rdoc.main = "README.markdown" # page to start on 11 | rdoc.title = "ruby_events Docs" 12 | rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder 13 | rdoc.options << '--line-numbers' 14 | end 15 | 16 | RSpec::Core::RakeTask.new(:spec) 17 | -------------------------------------------------------------------------------- /doc/rdoc/Object.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | Class: Object 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |

24 | Home 25 | Classes 26 | Methods 27 |

28 |
29 |
30 | 31 |
32 |
33 |

In Files

34 |
35 | 41 |
42 |
43 | 44 | 45 |
46 | 47 |
48 | 49 | 50 |
51 |

Parent

52 | 53 | 54 | 55 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
65 |

Methods

66 | 71 |
72 | 73 | 74 | 75 |
76 | 77 |
78 | 79 | 80 | 81 |
82 |

Class/Module Index 83 | [+]

86 |
87 |
88 | Quicksearch 89 | 91 |
92 |
93 | 94 | 103 | 104 |
105 | 106 | 107 |
108 |
109 | 110 |
111 |

Object

112 | 113 |
114 | 115 |

Extending the Object class with the events 116 | accessor.

117 | 118 |
119 | 120 | 121 |
122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 |
131 |

Attributes

132 | 133 | 134 |
135 | 136 | 137 | 138 | 139 |
140 | events[W] 142 |
143 | 144 |
145 | 146 | 147 | 148 |
149 |
150 | 151 |
152 | 153 | 154 | 155 | 156 |
157 |

Public Instance Methods

158 | 159 | 160 |
161 | 162 | 163 | 164 |
165 | events() 167 | click to toggle source 168 |
169 | 170 | 171 |
172 | 173 |

Attribute reader for the events accessor. Returns a new instance of the 174 | events class if not defined, or the already defined class otherwise.

175 | 176 | 177 | 178 |
179 |
180 | # File lib/ruby_events/object_patch.rb, line 7
181 | def events
182 |   @events ||= RubyEvents::Events.new(self)
183 | end
184 |
185 | 186 |
187 | 188 | 189 | 190 | 191 |
192 | 193 | 194 |
195 | 196 |
197 | 198 | 199 |
200 | 201 |
202 |

[Validate]

203 |

Generated with the Darkfish 204 | Rdoc Generator 2.

205 |
206 | 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /doc/rdoc/RubyEvents.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | Module: RubyEvents 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |

24 | Home 25 | Classes 26 | Methods 27 |

28 |
29 |
30 | 31 |
32 |
33 |

In Files

34 |
35 | 41 |
42 |
43 | 44 | 45 |
46 | 47 |
48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 |

Namespace

56 | 61 |
62 | 63 | 64 | 65 | 66 | 67 |
68 | 69 |
70 | 71 | 72 | 73 |
74 |

Class/Module Index 75 | [+]

78 |
79 |
80 | Quicksearch 81 | 83 |
84 |
85 | 86 | 95 | 96 |
97 | 98 | 99 |
100 |
101 | 102 |
103 |

RubyEvents

104 | 105 |
106 | 107 |

The RubyEvents module contains the core logic 108 | used by the events firing class. All Object’s are extended by default 109 | with an events accessor that is set to an instance of the RubyEvents::Events class. By calling the 111 | methods on this accessor, you can set up and listen to events or callbacks 112 | as fired by this class.

113 | 114 |
115 | 116 | 117 |
118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 |
129 | 130 | 131 |
132 | 133 |
134 |

[Validate]

135 |

Generated with the Darkfish 136 | Rdoc Generator 2.

137 |
138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /doc/rdoc/RubyEvents/Events.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | Class: RubyEvents::Events 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |

24 | Home 25 | Classes 26 | Methods 27 |

28 |
29 |
30 | 31 |
32 |
33 |

In Files

34 |
35 | 41 |
42 |
43 | 44 | 45 |
46 | 47 |
48 | 49 | 50 |
51 |

Parent

52 | 53 | 54 | 55 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
65 |

Methods

66 | 83 |
84 | 85 | 86 | 87 |
88 | 89 |
90 | 91 | 92 | 93 |
94 |

Class/Module Index 95 | [+]

98 |
99 |
100 | Quicksearch 101 | 103 |
104 |
105 | 106 | 115 | 116 |
117 | 118 | 119 |
120 |
121 | 122 |
123 |

RubyEvents::Events

124 | 125 |
126 | 127 |

The Events class. Contains all the methods and 128 | functionality that drives the actual processes of adding, listening, 129 | calling and receiving events.

130 | 131 |
132 | 133 | 134 |
135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 |
146 |

Public Class Methods

147 | 148 | 149 |
150 | 151 | 152 | 153 |
154 | new(parent) 156 | click to toggle source 157 |
158 | 159 | 160 |
161 | 162 |

Initialize the events class by instantiating the class methods we’ll be 163 | using.

164 | 165 | 166 | 167 |
168 |
169 | # File lib/ruby_events/core.rb, line 17
170 | def initialize(parent)
171 |   @parent, @events = parent, {}
172 | end
173 |
174 | 175 |
176 | 177 | 178 | 179 | 180 |
181 | 182 | 183 |
184 | 185 | 186 | 187 |
188 | version() 190 | click to toggle source 191 |
192 | 193 | 194 |
195 | 196 |

The current version of RubyEvents.

197 | 198 | 199 | 200 |
201 |
202 | # File lib/ruby_events/core.rb, line 11
203 | def self.version
204 |   '1.1.0'
205 | end
206 |
207 | 208 |
209 | 210 | 211 | 212 | 213 |
214 | 215 | 216 |
217 | 218 |
219 |

Public Instance Methods

220 | 221 | 222 |
223 | 224 | 225 | 226 |
227 | fire(event_type, *arguments) 229 | click to toggle source 230 |
231 | 232 | 233 |
234 | 235 |

Fire all registered listeners to the passed event, passing them the 236 | arguments as provided.

237 | 238 | 239 | 240 |
241 |
242 | # File lib/ruby_events/core.rb, line 37
243 | def fire(event_type, *arguments)
244 |   @events[event_type].each do |event|
245 |     event.call(*arguments)
246 |   end if event_is_defined(event_type)
247 | end
248 |
249 | 250 |
251 | 252 | 253 | 254 | 255 |
256 | 257 | 258 |
259 | 260 | 261 | 262 |
263 | fire_on_method(method, event_type, &block) 265 | click to toggle source 266 |
267 | 268 | 269 |
270 | 271 |

Set an event to fire when passed method is called. This is useful for 272 | adding callbacks or events to built-in methods.

273 | 274 | 275 | 276 |
277 |
278 | # File lib/ruby_events/core.rb, line 45
279 | def fire_on_method(method, event_type, &block)
280 |   if method.is_a? Array
281 |     method.map { |sym| fire_on_method(sym, event_type, &block) }
282 |     return
283 |   end
284 |   
285 |   # We alias @parent to parent here, because class_eval can't see outside
286 |   # this scope otherwise.
287 |   parent, old_method = @parent, ('ruby_events_' + method.to_s + '_event_old').to_sym
288 |   if parent && parent.respond_to?(method)
289 |     parent.class.class_eval do
290 |       # If the parent is already responding to the alias method, it means
291 |       # the fire_on_method event was already triggered. Remove the other
292 |       # event and continue if this happens.
293 |       if parent.respond_to?(old_method, true)
294 |         remove_method method
295 |         alias_method method, old_method
296 |         remove_method old_method
297 |       end
298 |     
299 |       alias_method old_method, method
300 |       private old_method
301 |       
302 |       # Make sure the self.send is at the end, or we won't return what we
303 |       # are supposed to.
304 |       define_method method do |*args|
305 |         events.fire(event_type, *args)
306 |         block.call(*args) if block # Calling the block we've been passed
307 |         __send__(old_method, *args)
308 |       end
309 |     end
310 |   else
311 |     raise 'The given object does not respond to method you are trying to intercept calls to.'
312 |   end
313 | end
314 |
315 | 316 |
317 | 318 | 319 | 320 | 321 |
322 | 323 | 324 |
325 | 326 | 327 | 328 |
329 | listen(event_type, procs = nil, &block) 331 | click to toggle source 332 |
333 | 334 | 335 |
336 | 337 |

Add a listener to the passed event type. You can pass a Proc, an array of 338 | Proc’s, or a block.

339 | 340 | 341 | 342 |
343 |
344 | # File lib/ruby_events/core.rb, line 23
345 | def listen(event_type, procs = nil, &block)
346 |   @events[event_type] = [] unless event_is_defined(event_type)
347 |   procs_collected = []
348 |   if procs.respond_to?(:each) && procs.respond_to?(:to_a)
349 |     procs_collected += procs.to_a
350 |   elsif procs
351 |     procs_collected << procs
352 |   end
353 |   procs_collected << block if block
354 |   @events[event_type] += procs_collected
355 | end
356 |
357 | 358 |
359 | 360 | 361 | 362 | 363 |
364 | 365 | 366 |
367 | 368 | 369 | 370 |
371 | remove(event_type, event) 373 | click to toggle source 374 |
375 | 376 | 377 |
378 | 379 |

Remove a method from the listening queue.

380 | 381 | 382 | 383 |
384 |
385 | # File lib/ruby_events/core.rb, line 82
386 | def remove(event_type, event)
387 |   @events[event_type].delete_if {|stored_event| stored_event == event} if event_is_defined(event_type)
388 | end
389 |
390 | 391 |
392 | 393 | 394 | 395 | 396 |
397 | 398 | 399 |
400 | 401 | 402 | 403 |
404 | remove_fire_on_method(method) 406 | click to toggle source 407 |
408 | 409 | 410 |
411 | 412 |

Remove a fire on method alias event.

413 | 414 | 415 | 416 |
417 |
418 | # File lib/ruby_events/core.rb, line 87
419 | def remove_fire_on_method(method)
420 |   parent, old_method = @parent, ('ruby_events_' + method.to_s + '_event_old').to_sym
421 |   parent.class.class_eval do
422 |     if parent.respond_to?(old_method, true)
423 |       remove_method method
424 |       alias_method method, old_method
425 |       public method
426 |     else
427 |       raise 'The fire on method trigger you were trying to remove does not exist.'
428 |     end
429 |   end
430 | end
431 |
432 | 433 |
434 | 435 | 436 | 437 | 438 |
439 | 440 | 441 |
442 | 443 |
444 | 445 | 446 |
447 | 448 |
449 |

[Validate]

450 |

Generated with the Darkfish 451 | Rdoc Generator 2.

452 |
453 | 454 | 455 | 456 | 457 | -------------------------------------------------------------------------------- /doc/rdoc/created.rid: -------------------------------------------------------------------------------- 1 | Fri, 17 Jun 2011 23:47:39 +0100 2 | lib/ruby_events.rb Fri, 17 Jun 2011 23:07:23 +0100 3 | lib/ruby_events/core.rb Fri, 17 Jun 2011 23:35:59 +0100 4 | README.markdown Fri, 17 Jun 2011 23:40:05 +0100 5 | lib/ruby_events/object_patch.rb Fri, 17 Jun 2011 20:53:32 +0100 6 | -------------------------------------------------------------------------------- /doc/rdoc/images/brick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/brick.png -------------------------------------------------------------------------------- /doc/rdoc/images/brick_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/brick_link.png -------------------------------------------------------------------------------- /doc/rdoc/images/bug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bug.png -------------------------------------------------------------------------------- /doc/rdoc/images/bullet_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bullet_black.png -------------------------------------------------------------------------------- /doc/rdoc/images/bullet_toggle_minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bullet_toggle_minus.png -------------------------------------------------------------------------------- /doc/rdoc/images/bullet_toggle_plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/bullet_toggle_plus.png -------------------------------------------------------------------------------- /doc/rdoc/images/date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/date.png -------------------------------------------------------------------------------- /doc/rdoc/images/find.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/find.png -------------------------------------------------------------------------------- /doc/rdoc/images/loadingAnimation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/loadingAnimation.gif -------------------------------------------------------------------------------- /doc/rdoc/images/macFFBgHack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/macFFBgHack.png -------------------------------------------------------------------------------- /doc/rdoc/images/package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/package.png -------------------------------------------------------------------------------- /doc/rdoc/images/page_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/page_green.png -------------------------------------------------------------------------------- /doc/rdoc/images/page_white_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/page_white_text.png -------------------------------------------------------------------------------- /doc/rdoc/images/page_white_width.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/page_white_width.png -------------------------------------------------------------------------------- /doc/rdoc/images/plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/plugin.png -------------------------------------------------------------------------------- /doc/rdoc/images/ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/ruby.png -------------------------------------------------------------------------------- /doc/rdoc/images/tag_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/tag_green.png -------------------------------------------------------------------------------- /doc/rdoc/images/wrench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/wrench.png -------------------------------------------------------------------------------- /doc/rdoc/images/wrench_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/wrench_orange.png -------------------------------------------------------------------------------- /doc/rdoc/images/zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/doc/rdoc/images/zoom.png -------------------------------------------------------------------------------- /doc/rdoc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | ruby_events Docs 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |

ruby_events Docs

23 | 24 | 25 |

This is the API documentation for 'ruby_events Docs'.

26 | 27 | 28 | 29 | 30 | 31 |

Classes/Modules

32 | 41 | 42 |

Methods

43 | 62 | 63 |
64 |

[Validate]

65 |

Generated with the Darkfish 66 | Rdoc Generator 2.

67 |
68 | 69 | 70 | -------------------------------------------------------------------------------- /doc/rdoc/js/darkfish.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Darkfish Page Functions 4 | * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ 5 | * 6 | * Author: Michael Granger 7 | * 8 | */ 9 | 10 | /* Provide console simulation for firebug-less environments */ 11 | if (!("console" in window) || !("firebug" in console)) { 12 | var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", 13 | "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; 14 | 15 | window.console = {}; 16 | for (var i = 0; i < names.length; ++i) 17 | window.console[names[i]] = function() {}; 18 | }; 19 | 20 | 21 | /** 22 | * Unwrap the first element that matches the given @expr@ from the targets and return them. 23 | */ 24 | $.fn.unwrap = function( expr ) { 25 | return this.each( function() { 26 | $(this).parents( expr ).eq( 0 ).after( this ).remove(); 27 | }); 28 | }; 29 | 30 | 31 | function showSource( e ) { 32 | var target = e.target; 33 | var codeSections = $(target). 34 | parents('.method-detail'). 35 | find('.method-source-code'); 36 | 37 | $(target). 38 | parents('.method-detail'). 39 | find('.method-source-code'). 40 | slideToggle(); 41 | }; 42 | 43 | function hookSourceViews() { 44 | $('.method-description,.method-heading').click( showSource ); 45 | }; 46 | 47 | function toggleDebuggingSection() { 48 | $('.debugging-section').slideToggle(); 49 | }; 50 | 51 | function hookDebuggingToggle() { 52 | $('#debugging-toggle img').click( toggleDebuggingSection ); 53 | }; 54 | 55 | function hookQuickSearch() { 56 | $('.quicksearch-field').each( function() { 57 | var searchElems = $(this).parents('.section').find( 'li' ); 58 | var toggle = $(this).parents('.section').find('h3 .search-toggle'); 59 | // console.debug( "Toggle is: %o", toggle ); 60 | var qsbox = $(this).parents('form').get( 0 ); 61 | 62 | $(this).quicksearch( this, searchElems, { 63 | noSearchResultsIndicator: 'no-class-search-results', 64 | focusOnLoad: false 65 | }); 66 | $(toggle).click( function() { 67 | // console.debug( "Toggling qsbox: %o", qsbox ); 68 | $(qsbox).toggle(); 69 | }); 70 | }); 71 | }; 72 | 73 | function highlightTarget( anchor ) { 74 | console.debug( "Highlighting target '%s'.", anchor ); 75 | 76 | $("a[name=" + anchor + "]").each( function() { 77 | if ( !$(this).parent().parent().hasClass('target-section') ) { 78 | console.debug( "Wrapping the target-section" ); 79 | $('div.method-detail').unwrap( 'div.target-section' ); 80 | $(this).parent().wrap( '
' ); 81 | } else { 82 | console.debug( "Already wrapped." ); 83 | } 84 | }); 85 | }; 86 | 87 | function highlightLocationTarget() { 88 | console.debug( "Location hash: %s", window.location.hash ); 89 | if ( ! window.location.hash || window.location.hash.length == 0 ) return; 90 | 91 | var anchor = window.location.hash.substring(1); 92 | console.debug( "Found anchor: %s; matching %s", anchor, "a[name=" + anchor + "]" ); 93 | 94 | highlightTarget( anchor ); 95 | }; 96 | 97 | function highlightClickTarget( event ) { 98 | console.debug( "Highlighting click target for event %o", event.target ); 99 | try { 100 | var anchor = $(event.target).attr( 'href' ).substring(1); 101 | console.debug( "Found target anchor: %s", anchor ); 102 | highlightTarget( anchor ); 103 | } catch ( err ) { 104 | console.error( "Exception while highlighting: %o", err ); 105 | }; 106 | }; 107 | 108 | 109 | $(document).ready( function() { 110 | hookSourceViews(); 111 | hookDebuggingToggle(); 112 | hookQuickSearch(); 113 | highlightLocationTarget(); 114 | 115 | $('ul.link-list a').bind( "click", highlightClickTarget ); 116 | }); 117 | -------------------------------------------------------------------------------- /doc/rdoc/js/jquery.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery 1.2.6 - New Wave Javascript 3 | * 4 | * Copyright (c) 2008 John Resig (jquery.com) 5 | * Dual licensed under the MIT (MIT-LICENSE.txt) 6 | * and GPL (GPL-LICENSE.txt) licenses. 7 | * 8 | * $Date: 2008-09-25 09:50:52 -0700 (Thu, 25 Sep 2008) $ 9 | * $Rev: 38 $ 10 | */ 11 | (function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else 12 | return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else 13 | return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else 14 | selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else 16 | this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else 17 | return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else 18 | jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else 22 | jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
","
"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else 23 | ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else 24 | while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else 26 | for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else 28 | xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else 29 | jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else 30 | for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else 31 | s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else 32 | e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); -------------------------------------------------------------------------------- /doc/rdoc/js/quicksearch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * JQuery QuickSearch - Hook up a form field to hide non-matching elements. 4 | * $Id: quicksearch.js 53 2009-01-07 02:52:03Z deveiant $ 5 | * 6 | * Author: Michael Granger 7 | * 8 | */ 9 | jQuery.fn.quicksearch = function( target, searchElems, options ) { 10 | // console.debug( "Quicksearch fn" ); 11 | 12 | var settings = { 13 | delay: 250, 14 | clearButton: false, 15 | highlightMatches: false, 16 | focusOnLoad: false, 17 | noSearchResultsIndicator: null 18 | }; 19 | if ( options ) $.extend( settings, options ); 20 | 21 | return jQuery(this).each( function() { 22 | // console.debug( "Creating a new quicksearch on %o for %o", this, searchElems ); 23 | new jQuery.quicksearch( this, searchElems, settings ); 24 | }); 25 | }; 26 | 27 | 28 | jQuery.quicksearch = function( searchBox, searchElems, settings ) { 29 | var timeout; 30 | var boxdiv = $(searchBox).parents('div').eq(0); 31 | 32 | function init() { 33 | setupKeyEventHandlers(); 34 | focusOnLoad(); 35 | }; 36 | 37 | function setupKeyEventHandlers() { 38 | // console.debug( "Hooking up the 'keypress' event to %o", searchBox ); 39 | $(searchBox). 40 | unbind( 'keyup' ). 41 | keyup( function(e) { return onSearchKey( e.keyCode ); }); 42 | $(searchBox). 43 | unbind( 'keypress' ). 44 | keypress( function(e) { 45 | switch( e.which ) { 46 | // Execute the search on Enter, Tab, or Newline 47 | case 9: 48 | case 13: 49 | case 10: 50 | clearTimeout( timeout ); 51 | e.preventDefault(); 52 | doQuickSearch(); 53 | break; 54 | 55 | // Allow backspace 56 | case 8: 57 | return true; 58 | break; 59 | 60 | // Only allow valid search characters 61 | default: 62 | return validQSChar( e.charCode ); 63 | } 64 | }); 65 | }; 66 | 67 | function focusOnLoad() { 68 | if ( !settings.focusOnLoad ) return false; 69 | $(searchBox).focus(); 70 | }; 71 | 72 | function onSearchKey ( code ) { 73 | clearTimeout( timeout ); 74 | // console.debug( "...scheduling search." ); 75 | timeout = setTimeout( doQuickSearch, settings.delay ); 76 | }; 77 | 78 | function validQSChar( code ) { 79 | var c = String.fromCharCode( code ); 80 | return ( 81 | (c == ':') || 82 | (c >= 'a' && c <= 'z') || 83 | (c >= 'A' && c <= 'Z') 84 | ); 85 | }; 86 | 87 | function doQuickSearch() { 88 | var searchText = searchBox.value; 89 | var pat = new RegExp( searchText, "im" ); 90 | var shownCount = 0; 91 | 92 | if ( settings.noSearchResultsIndicator ) { 93 | $('#' + settings.noSearchResultsIndicator).hide(); 94 | } 95 | 96 | // All elements start out hidden 97 | $(searchElems).each( function(index) { 98 | var str = $(this).text(); 99 | 100 | if ( pat.test(str) ) { 101 | shownCount += 1; 102 | $(this).fadeIn(); 103 | } else { 104 | $(this).hide(); 105 | } 106 | }); 107 | 108 | if ( shownCount == 0 && settings.noSearchResultsIndicator ) { 109 | $('#' + settings.noSearchResultsIndicator).slideDown(); 110 | } 111 | }; 112 | 113 | init(); 114 | }; 115 | -------------------------------------------------------------------------------- /doc/rdoc/js/thickbox-compressed.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Thickbox 3 - One Box To Rule Them All. 3 | * By Cody Lindley (http://www.codylindley.com) 4 | * Copyright (c) 2007 cody lindley 5 | * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php 6 | */ 7 | 8 | var tb_pathToImage = "../images/loadingAnimation.gif"; 9 | 10 | eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('$(o).2S(9(){1u(\'a.18, 3n.18, 3i.18\');1w=1p 1t();1w.L=2H});9 1u(b){$(b).s(9(){6 t=X.Q||X.1v||M;6 a=X.u||X.23;6 g=X.1N||P;19(t,a,g);X.2E();H P})}9 19(d,f,g){3m{3(2t o.v.J.2i==="2g"){$("v","11").r({A:"28%",z:"28%"});$("11").r("22","2Z");3(o.1Y("1F")===M){$("v").q("<4 5=\'B\'><4 5=\'8\'>");$("#B").s(G)}}n{3(o.1Y("B")===M){$("v").q("<4 5=\'B\'><4 5=\'8\'>");$("#B").s(G)}}3(1K()){$("#B").1J("2B")}n{$("#B").1J("2z")}3(d===M){d=""}$("v").q("<4 5=\'K\'><1I L=\'"+1w.L+"\' />");$(\'#K\').2y();6 h;3(f.O("?")!==-1){h=f.3l(0,f.O("?"))}n{h=f}6 i=/\\.2s$|\\.2q$|\\.2m$|\\.2l$|\\.2k$/;6 j=h.1C().2h(i);3(j==\'.2s\'||j==\'.2q\'||j==\'.2m\'||j==\'.2l\'||j==\'.2k\'){1D="";1G="";14="";1z="";1x="";R="";1n="";1r=P;3(g){E=$("a[@1N="+g+"]").36();25(D=0;((D&1d;&1d;2T &2R;"}n{1D=E[D].Q;1G=E[D].u;14="<1e 5=\'1U\'>&1d;&1d;&2O; 2N"}}n{1r=1b;1n="1t "+(D+1)+" 2L "+(E.1c)}}}S=1p 1t();S.1g=9(){S.1g=M;6 a=2x();6 x=a[0]-1M;6 y=a[1]-1M;6 b=S.z;6 c=S.A;3(b>x){c=c*(x/b);b=x;3(c>y){b=b*(y/c);c=y}}n 3(c>y){b=b*(y/c);c=y;3(b>x){c=c*(x/b);b=x}}13=b+30;1a=c+2G;$("#8").q("<1I 5=\'2F\' L=\'"+f+"\' z=\'"+b+"\' A=\'"+c+"\' 23=\'"+d+"\'/>"+"<4 5=\'2D\'>"+d+"<4 5=\'2C\'>"+1n+14+R+"<4 5=\'2A\'>1l 1k 1j 1s");$("#Z").s(G);3(!(14==="")){9 12(){3($(o).N("s",12)){$(o).N("s",12)}$("#8").C();$("v").q("<4 5=\'8\'>");19(1D,1G,g);H P}$("#1U").s(12)}3(!(R==="")){9 1i(){$("#8").C();$("v").q("<4 5=\'8\'>");19(1z,1x,g);H P}$("#1X").s(1i)}o.1h=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}n 3(I==3k){3(!(R=="")){o.1h="";1i()}}n 3(I==3j){3(!(14=="")){o.1h="";12()}}};16();$("#K").C();$("#1L").s(G);$("#8").r({Y:"T"})};S.L=f}n{6 l=f.2r(/^[^\\?]+\\??/,\'\');6 m=2p(l);13=(m[\'z\']*1)+30||3h;1a=(m[\'A\']*1)+3g||3f;W=13-30;V=1a-3e;3(f.O(\'2j\')!=-1){1E=f.1B(\'3d\');$("#15").C();3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"<4 5=\'2e\'>1l 1k 1j 1s ")}n{$("#B").N();$("#8").q(" ")}}n{3($("#8").r("Y")!="T"){3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"<4 5=\'2e\'>1l 1k 1j 1s<4 5=\'F\' J=\'z:"+W+"p;A:"+V+"p\'>")}n{$("#B").N();$("#8").q("<4 5=\'F\' 3c=\'3b\' J=\'z:"+W+"p;A:"+V+"p;\'>")}}n{$("#F")[0].J.z=W+"p";$("#F")[0].J.A=V+"p";$("#F")[0].3a=0;$("#1H").11(d)}}$("#Z").s(G);3(f.O(\'37\')!=-1){$("#F").q($(\'#\'+m[\'26\']).1T());$("#8").24(9(){$(\'#\'+m[\'26\']).q($("#F").1T())});16();$("#K").C();$("#8").r({Y:"T"})}n 3(f.O(\'2j\')!=-1){16();3($.1q.35){$("#K").C();$("#8").r({Y:"T"})}}n{$("#F").34(f+="&1y="+(1p 33().32()),9(){16();$("#K").C();1u("#F a.18");$("#8").r({Y:"T"})})}}3(!m[\'1A\']){o.21=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}}}}31(e){}}9 1m(){$("#K").C();$("#8").r({Y:"T"})}9 G(){$("#2Y").N("s");$("#Z").N("s");$("#8").2X("2W",9(){$(\'#8,#B,#1F\').2V("24").N().C()});$("#K").C();3(2t o.v.J.2i=="2g"){$("v","11").r({A:"1Z",z:"1Z"});$("11").r("22","")}o.1h="";o.21="";H P}9 16(){$("#8").r({2U:\'-\'+20((13/2),10)+\'p\',z:13+\'p\'});3(!(1V.1q.2Q&&1V.1q.2P<7)){$("#8").r({38:\'-\'+20((1a/2),10)+\'p\'})}}9 2p(a){6 b={};3(!a){H b}6 c=a.1B(/[;&]/);25(6 i=0;i 2 | 4 | 5 | 6 | 7 | 8 | 9 | File: core.rb [ruby_events Docs] 10 | 11 | 12 | 13 | 15 | 17 | 19 | 21 | 22 | 23 | 24 |
25 |
26 |
Last Modified
27 |
Fri Jun 17 23:35:59 +0100 2011
28 | 29 | 30 |
Requires
31 |
32 |
    33 | 34 |
35 |
36 | 37 | 38 | 39 |
40 |
41 | 42 |
43 | 44 |
45 |

Description

46 | 47 |

The RubyEvents module contains the core 48 | logic used by the events firing class. All Object’s are extended by 49 | default with an events accessor that is set to an instance of the RubyEvents::Events class. By 51 | calling the methods on this accessor, you can set up and listen to events 52 | or callbacks as fired by this class.

53 | 54 |
55 | 56 |
57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /doc/rdoc/lib/ruby_events/object_patch_rb.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | File: object_patch.rb [ruby_events Docs] 10 | 11 | 12 | 13 | 15 | 17 | 19 | 21 | 22 | 23 | 24 |
25 |
26 |
Last Modified
27 |
Fri Jun 17 20:53:32 +0100 2011
28 | 29 | 30 |
Requires
31 |
32 |
    33 | 34 |
35 |
36 | 37 | 38 | 39 |
40 |
41 | 42 |
43 | 44 |
45 |

Description

46 | 47 |

Extending the Object class with the events 48 | accessor.

49 | 50 |
51 | 52 |
53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /doc/rdoc/lib/ruby_events_rb.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | File: ruby_events.rb [ruby_events Docs] 10 | 11 | 12 | 13 | 15 | 17 | 19 | 21 | 22 | 23 | 24 |
25 |
26 |
Last Modified
27 |
Fri Jun 17 23:07:23 +0100 2011
28 | 29 | 30 |
Requires
31 |
32 |
    33 | 34 |
35 |
36 | 37 | 38 | 39 |
40 |
41 | 42 |
43 | 44 |
45 |

Description

46 | 47 |
48 | 49 |
50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /doc/rdoc/rdoc.css: -------------------------------------------------------------------------------- 1 | /* 2 | * "Darkfish" Rdoc CSS 3 | * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $ 4 | * 5 | * Author: Michael Granger 6 | * 7 | */ 8 | 9 | /* Base Green is: #6C8C22 */ 10 | 11 | *{ padding: 0; margin: 0; } 12 | 13 | body { 14 | background: #efefef; 15 | font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif; 16 | } 17 | body.class, body.module, body.file { 18 | margin-left: 40px; 19 | } 20 | body.file-popup { 21 | font-size: 90%; 22 | margin-left: 0; 23 | } 24 | 25 | h1 { 26 | font-size: 300%; 27 | text-shadow: rgba(135,145,135,0.65) 2px 2px 3px; 28 | color: #6C8C22; 29 | } 30 | h2,h3,h4 { margin-top: 1.5em; } 31 | 32 | :link, 33 | :visited { 34 | color: #6C8C22; 35 | text-decoration: none; 36 | } 37 | :link:hover, 38 | :visited:hover { 39 | border-bottom: 1px dotted #6C8C22; 40 | } 41 | 42 | pre { 43 | background: #ddd; 44 | padding: 0.5em 0; 45 | } 46 | 47 | 48 | /* @group Generic Classes */ 49 | 50 | .initially-hidden { 51 | display: none; 52 | } 53 | 54 | .quicksearch-field { 55 | width: 98%; 56 | background: #ddd; 57 | border: 1px solid #aaa; 58 | height: 1.5em; 59 | -webkit-border-radius: 4px; 60 | } 61 | .quicksearch-field:focus { 62 | background: #f1edba; 63 | } 64 | 65 | .missing-docs { 66 | font-size: 120%; 67 | background: white url(images/wrench_orange.png) no-repeat 4px center; 68 | color: #ccc; 69 | line-height: 2em; 70 | border: 1px solid #d00; 71 | opacity: 1; 72 | padding-left: 20px; 73 | text-indent: 24px; 74 | letter-spacing: 3px; 75 | font-weight: bold; 76 | -webkit-border-radius: 5px; 77 | -moz-border-radius: 5px; 78 | } 79 | 80 | .target-section { 81 | border: 2px solid #dcce90; 82 | border-left-width: 8px; 83 | padding: 0 1em; 84 | background: #fff3c2; 85 | } 86 | 87 | /* @end */ 88 | 89 | 90 | /* @group Index Page, Standalone file pages */ 91 | body.indexpage { 92 | margin: 1em 3em; 93 | } 94 | body.indexpage p, 95 | body.indexpage div, 96 | body.file p { 97 | margin: 1em 0; 98 | } 99 | 100 | .indexpage ol, 101 | .file #documentation ol { 102 | line-height: 160%; 103 | } 104 | 105 | .indexpage ul, 106 | .file #documentation ul { 107 | line-height: 160%; 108 | list-style: none; 109 | } 110 | .indexpage ul :link, 111 | .indexpage ul :visited { 112 | font-size: 16px; 113 | } 114 | 115 | .indexpage li, 116 | .file #documentation li { 117 | padding-left: 20px; 118 | } 119 | 120 | .indexpage ol, 121 | .file #documentation ol { 122 | margin-left: 20px; 123 | } 124 | 125 | .indexpage ol > li, 126 | .file #documentation ol > li { 127 | padding-left: 0; 128 | } 129 | 130 | .indexpage ul > li, 131 | .file #documentation ul > li { 132 | background: url(images/bullet_black.png) no-repeat left 4px; 133 | } 134 | .indexpage li.module { 135 | background: url(images/package.png) no-repeat left 4px; 136 | } 137 | .indexpage li.class { 138 | background: url(images/ruby.png) no-repeat left 4px; 139 | } 140 | .indexpage li.file { 141 | background: url(images/page_white_text.png) no-repeat left 4px; 142 | } 143 | .file li p, 144 | .indexpage li p { 145 | margin: 0 0; 146 | } 147 | 148 | /* @end */ 149 | 150 | /* @group Top-Level Structure */ 151 | 152 | .class #metadata, 153 | .file #metadata, 154 | .module #metadata { 155 | float: left; 156 | width: 260px; 157 | } 158 | 159 | .class #documentation, 160 | .file #documentation, 161 | .module #documentation { 162 | margin: 2em 1em 5em 300px; 163 | min-width: 340px; 164 | } 165 | 166 | .file #metadata { 167 | margin: 0.8em; 168 | } 169 | 170 | #validator-badges { 171 | clear: both; 172 | margin: 1em 1em 2em; 173 | } 174 | 175 | /* @end */ 176 | 177 | /* @group Metadata Section */ 178 | #metadata .section { 179 | background-color: #dedede; 180 | -moz-border-radius: 5px; 181 | -webkit-border-radius: 5px; 182 | border: 1px solid #aaa; 183 | margin: 0 8px 16px; 184 | font-size: 90%; 185 | overflow: hidden; 186 | } 187 | #metadata h3.section-header { 188 | margin: 0; 189 | padding: 2px 8px; 190 | background: #ccc; 191 | color: #666; 192 | -moz-border-radius-topleft: 4px; 193 | -moz-border-radius-topright: 4px; 194 | -webkit-border-top-left-radius: 4px; 195 | -webkit-border-top-right-radius: 4px; 196 | border-bottom: 1px solid #aaa; 197 | } 198 | #metadata #home-section h3.section-header { 199 | border-bottom: 0; 200 | } 201 | 202 | #metadata ul, 203 | #metadata dl, 204 | #metadata p { 205 | padding: 8px; 206 | list-style: none; 207 | } 208 | 209 | #file-metadata ul { 210 | padding-left: 28px; 211 | list-style-image: url(images/page_green.png); 212 | } 213 | 214 | dl.svninfo { 215 | color: #666; 216 | margin: 0; 217 | } 218 | dl.svninfo dt { 219 | font-weight: bold; 220 | } 221 | 222 | ul.link-list li { 223 | white-space: nowrap; 224 | } 225 | ul.link-list .type { 226 | font-size: 8px; 227 | text-transform: uppercase; 228 | color: white; 229 | background: #969696; 230 | padding: 2px 4px; 231 | -webkit-border-radius: 5px; 232 | } 233 | 234 | /* @end */ 235 | 236 | 237 | /* @group Project Metadata Section */ 238 | #project-metadata { 239 | margin-top: 3em; 240 | } 241 | 242 | .file #project-metadata { 243 | margin-top: 0em; 244 | } 245 | 246 | #project-metadata .section { 247 | border: 1px solid #aaa; 248 | } 249 | #project-metadata h3.section-header { 250 | border-bottom: 1px solid #aaa; 251 | position: relative; 252 | } 253 | #project-metadata h3.section-header .search-toggle { 254 | position: absolute; 255 | right: 5px; 256 | } 257 | 258 | 259 | #project-metadata form { 260 | color: #777; 261 | background: #ccc; 262 | padding: 8px 8px 16px; 263 | border-bottom: 1px solid #bbb; 264 | } 265 | #project-metadata fieldset { 266 | border: 0; 267 | } 268 | 269 | #no-class-search-results { 270 | margin: 0 auto 1em; 271 | text-align: center; 272 | font-size: 14px; 273 | font-weight: bold; 274 | color: #aaa; 275 | } 276 | 277 | /* @end */ 278 | 279 | 280 | /* @group Documentation Section */ 281 | .description { 282 | font-size: 100%; 283 | color: #333; 284 | } 285 | 286 | .description p { 287 | margin: 1em 0.4em; 288 | } 289 | 290 | .description li p { 291 | margin: 0; 292 | } 293 | 294 | .description ul { 295 | margin-left: 1.5em; 296 | } 297 | .description ul li { 298 | line-height: 1.4em; 299 | } 300 | 301 | .description dl, 302 | #documentation dl { 303 | margin: 8px 1.5em; 304 | border: 1px solid #ccc; 305 | } 306 | .description dl { 307 | font-size: 14px; 308 | } 309 | 310 | .description dt, 311 | #documentation dt { 312 | padding: 2px 4px; 313 | font-weight: bold; 314 | background: #ddd; 315 | } 316 | .description dd, 317 | #documentation dd { 318 | padding: 2px 12px; 319 | } 320 | .description dd + dt, 321 | #documentation dd + dt { 322 | margin-top: 0.7em; 323 | } 324 | 325 | #documentation .section { 326 | font-size: 90%; 327 | } 328 | 329 | #documentation h2.section-header { 330 | margin-top: 2em; 331 | padding: 0.75em 0.5em; 332 | background: #ccc; 333 | color: #333; 334 | font-size: 175%; 335 | border: 1px solid #bbb; 336 | -moz-border-radius: 3px; 337 | -webkit-border-radius: 3px; 338 | } 339 | 340 | #documentation h3.section-header { 341 | margin-top: 2em; 342 | padding: 0.25em 0.5em; 343 | background-color: #dedede; 344 | color: #333; 345 | font-size: 150%; 346 | border: 1px solid #bbb; 347 | -moz-border-radius: 3px; 348 | -webkit-border-radius: 3px; 349 | } 350 | 351 | #constants-list > dl, 352 | #attributes-list > dl { 353 | margin: 1em 0 2em; 354 | border: 0; 355 | } 356 | #constants-list > dl dt, 357 | #attributes-list > dl dt { 358 | padding-left: 0; 359 | font-weight: bold; 360 | font-family: Monaco, "Andale Mono"; 361 | background: inherit; 362 | } 363 | #constants-list > dl dt a, 364 | #attributes-list > dl dt a { 365 | color: inherit; 366 | } 367 | #constants-list > dl dd, 368 | #attributes-list > dl dd { 369 | margin: 0 0 1em 0; 370 | padding: 0; 371 | color: #666; 372 | } 373 | 374 | .documentation-section h2 { 375 | position: relative; 376 | } 377 | 378 | .documentation-section h2 a { 379 | position: absolute; 380 | top: 8px; 381 | right: 10px; 382 | font-size: 12px; 383 | color: #9b9877; 384 | visibility: hidden; 385 | } 386 | 387 | .documentation-section h2:hover a { 388 | visibility: visible; 389 | } 390 | 391 | /* @group Method Details */ 392 | 393 | #documentation .method-source-code { 394 | display: none; 395 | } 396 | 397 | #documentation .method-detail { 398 | margin: 0.5em 0; 399 | padding: 0.5em 0; 400 | cursor: pointer; 401 | } 402 | #documentation .method-detail:hover { 403 | background-color: #f1edba; 404 | } 405 | #documentation .method-heading { 406 | position: relative; 407 | padding: 2px 4px 0 20px; 408 | font-size: 125%; 409 | font-weight: bold; 410 | color: #333; 411 | background: url(images/brick.png) no-repeat left bottom; 412 | } 413 | #documentation .method-heading :link, 414 | #documentation .method-heading :visited { 415 | color: inherit; 416 | } 417 | #documentation .method-click-advice { 418 | position: absolute; 419 | top: 2px; 420 | right: 5px; 421 | font-size: 10px; 422 | color: #9b9877; 423 | visibility: hidden; 424 | padding-right: 20px; 425 | line-height: 20px; 426 | background: url(images/zoom.png) no-repeat right top; 427 | } 428 | #documentation .method-detail:hover .method-click-advice { 429 | visibility: visible; 430 | } 431 | 432 | #documentation .method-alias .method-heading { 433 | color: #666; 434 | background: url(images/brick_link.png) no-repeat left bottom; 435 | } 436 | 437 | #documentation .method-description, 438 | #documentation .aliases { 439 | margin: 0 20px; 440 | color: #666; 441 | } 442 | 443 | #documentation .method-description p, 444 | #documentation .aliases p { 445 | line-height: 1.2em; 446 | } 447 | 448 | #documentation .aliases { 449 | padding-top: 4px; 450 | font-style: italic; 451 | cursor: default; 452 | } 453 | #documentation .method-description p { 454 | padding: 0; 455 | } 456 | #documentation .method-description p + p { 457 | margin-bottom: 0.5em; 458 | } 459 | #documentation .method-description ul { 460 | margin-left: 1.5em; 461 | } 462 | 463 | #documentation .attribute-method-heading { 464 | background: url(images/tag_green.png) no-repeat left bottom; 465 | } 466 | #documentation #attribute-method-details .method-detail:hover { 467 | background-color: transparent; 468 | cursor: default; 469 | } 470 | #documentation .attribute-access-type { 471 | font-size: 60%; 472 | text-transform: uppercase; 473 | vertical-align: super; 474 | padding: 0 2px; 475 | } 476 | /* @end */ 477 | 478 | /* @end */ 479 | 480 | 481 | 482 | /* @group Source Code */ 483 | 484 | div.method-source-code { 485 | background: #262626; 486 | color: #efefef; 487 | margin: 1em; 488 | padding: 0.5em; 489 | border: 1px dashed #999; 490 | overflow: hidden; 491 | } 492 | 493 | div.method-source-code pre { 494 | background: inherit; 495 | padding: 0; 496 | color: white; 497 | overflow: auto; 498 | } 499 | 500 | /* @group Ruby keyword styles */ 501 | 502 | .ruby-constant { color: #7fffd4; background: transparent; } 503 | .ruby-keyword { color: #00ffff; background: transparent; } 504 | .ruby-ivar { color: #eedd82; background: transparent; } 505 | .ruby-operator { color: #00ffee; background: transparent; } 506 | .ruby-identifier { color: #ffdead; background: transparent; } 507 | .ruby-node { color: #ffa07a; background: transparent; } 508 | .ruby-comment { color: #b22222; font-weight: bold; background: transparent; } 509 | .ruby-regexp { color: #ffa07a; background: transparent; } 510 | .ruby-value { color: #7fffd4; background: transparent; } 511 | 512 | /* @end */ 513 | /* @end */ 514 | 515 | 516 | /* @group File Popup Contents */ 517 | 518 | .file #metadata, 519 | .file-popup #metadata { 520 | } 521 | 522 | .file-popup dl { 523 | font-size: 80%; 524 | padding: 0.75em; 525 | background-color: #dedede; 526 | color: #333; 527 | border: 1px solid #bbb; 528 | -moz-border-radius: 3px; 529 | -webkit-border-radius: 3px; 530 | } 531 | .file dt { 532 | font-weight: bold; 533 | padding-left: 22px; 534 | line-height: 20px; 535 | background: url(images/page_white_width.png) no-repeat left top; 536 | } 537 | .file dt.modified-date { 538 | background: url(images/date.png) no-repeat left top; 539 | } 540 | .file dt.requires { 541 | background: url(images/plugin.png) no-repeat left top; 542 | } 543 | .file dt.scs-url { 544 | background: url(images/wrench.png) no-repeat left top; 545 | } 546 | 547 | .file dl dd { 548 | margin: 0 0 1em 0; 549 | } 550 | .file #metadata dl dd ul { 551 | list-style: circle; 552 | margin-left: 20px; 553 | padding-top: 0; 554 | } 555 | .file #metadata dl dd ul li { 556 | } 557 | 558 | 559 | .file h2 { 560 | margin-top: 2em; 561 | padding: 0.75em 0.5em; 562 | background-color: #dedede; 563 | color: #333; 564 | font-size: 120%; 565 | border: 1px solid #bbb; 566 | -moz-border-radius: 3px; 567 | -webkit-border-radius: 3px; 568 | } 569 | 570 | /* @end */ 571 | 572 | 573 | 574 | 575 | /* @group ThickBox Styles */ 576 | #TB_window { 577 | font: 12px Arial, Helvetica, sans-serif; 578 | color: #333333; 579 | } 580 | 581 | #TB_secondLine { 582 | font: 10px Arial, Helvetica, sans-serif; 583 | color:#666666; 584 | } 585 | 586 | #TB_window :link, 587 | #TB_window :visited { color: #666666; } 588 | #TB_window :link:hover, 589 | #TB_window :visited:hover { color: #000; } 590 | #TB_window :link:active, 591 | #TB_window :visited:active { color: #666666; } 592 | #TB_window :link:focus, 593 | #TB_window :visited:focus { color: #666666; } 594 | 595 | #TB_overlay { 596 | position: fixed; 597 | z-index:100; 598 | top: 0px; 599 | left: 0px; 600 | height:100%; 601 | width:100%; 602 | } 603 | 604 | .TB_overlayMacFFBGHack {background: url(images/macFFBgHack.png) repeat;} 605 | .TB_overlayBG { 606 | background-color:#000; 607 | filter:alpha(opacity=75); 608 | -moz-opacity: 0.75; 609 | opacity: 0.75; 610 | } 611 | 612 | * html #TB_overlay { /* ie6 hack */ 613 | position: absolute; 614 | height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); 615 | } 616 | 617 | #TB_window { 618 | position: fixed; 619 | background: #ffffff; 620 | z-index: 102; 621 | color:#000000; 622 | display:none; 623 | border: 4px solid #525252; 624 | text-align:left; 625 | top:50%; 626 | left:50%; 627 | } 628 | 629 | * html #TB_window { /* ie6 hack */ 630 | position: absolute; 631 | margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); 632 | } 633 | 634 | #TB_window img#TB_Image { 635 | display:block; 636 | margin: 15px 0 0 15px; 637 | border-right: 1px solid #ccc; 638 | border-bottom: 1px solid #ccc; 639 | border-top: 1px solid #666; 640 | border-left: 1px solid #666; 641 | } 642 | 643 | #TB_caption{ 644 | height:25px; 645 | padding:7px 30px 10px 25px; 646 | float:left; 647 | } 648 | 649 | #TB_closeWindow{ 650 | height:25px; 651 | padding:11px 25px 10px 0; 652 | float:right; 653 | } 654 | 655 | #TB_closeAjaxWindow{ 656 | padding:7px 10px 5px 0; 657 | margin-bottom:1px; 658 | text-align:right; 659 | float:right; 660 | } 661 | 662 | #TB_ajaxWindowTitle{ 663 | float:left; 664 | padding:7px 0 5px 10px; 665 | margin-bottom:1px; 666 | font-size: 22px; 667 | } 668 | 669 | #TB_title{ 670 | background-color: #6C8C22; 671 | color: #dedede; 672 | height:40px; 673 | } 674 | #TB_title :link, 675 | #TB_title :visited { 676 | color: white !important; 677 | border-bottom: 1px dotted #dedede; 678 | } 679 | 680 | #TB_ajaxContent{ 681 | clear:both; 682 | padding:2px 15px 15px 15px; 683 | overflow:auto; 684 | text-align:left; 685 | line-height:1.4em; 686 | } 687 | 688 | #TB_ajaxContent.TB_modal{ 689 | padding:15px; 690 | } 691 | 692 | #TB_ajaxContent p{ 693 | padding:5px 0px 5px 0px; 694 | } 695 | 696 | #TB_load{ 697 | position: fixed; 698 | display:none; 699 | height:13px; 700 | width:208px; 701 | z-index:103; 702 | top: 50%; 703 | left: 50%; 704 | margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */ 705 | } 706 | 707 | * html #TB_load { /* ie6 hack */ 708 | position: absolute; 709 | margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); 710 | } 711 | 712 | #TB_HideSelect{ 713 | z-index:99; 714 | position:fixed; 715 | top: 0; 716 | left: 0; 717 | background-color:#fff; 718 | border:none; 719 | filter:alpha(opacity=0); 720 | -moz-opacity: 0; 721 | opacity: 0; 722 | height:100%; 723 | width:100%; 724 | } 725 | 726 | * html #TB_HideSelect { /* ie6 hack */ 727 | position: absolute; 728 | height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); 729 | } 730 | 731 | #TB_iframeContent{ 732 | clear:both; 733 | border:none; 734 | margin-bottom:-1px; 735 | margin-top:1px; 736 | _margin-bottom:1px; 737 | } 738 | 739 | /* @end */ 740 | 741 | /* @group Debugging Section */ 742 | 743 | #debugging-toggle { 744 | text-align: center; 745 | } 746 | #debugging-toggle img { 747 | cursor: pointer; 748 | } 749 | 750 | #rdoc-debugging-section-dump { 751 | display: none; 752 | margin: 0 2em 2em; 753 | background: #ccc; 754 | border: 1px solid #999; 755 | } 756 | 757 | 758 | 759 | /* @end */ 760 | -------------------------------------------------------------------------------- /lib/ruby_events.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "ruby_events/core") 2 | require File.join(File.dirname(__FILE__), "ruby_events/object_patch") 3 | -------------------------------------------------------------------------------- /lib/ruby_events/core.rb: -------------------------------------------------------------------------------- 1 | # The RubyEvents module contains the core logic used by the events firing class. 2 | # All Object's are extended by default with an events accessor that is set to 3 | # an instance of the RubyEvents::Events class. By calling the methods on this 4 | # accessor, you can set up and listen to events or callbacks as fired by this 5 | # class. 6 | module RubyEvents 7 | # The Events class. Contains all the methods and functionality that drives 8 | # the actual processes of adding, listening, calling and receiving events. 9 | class Events 10 | # The current version of RubyEvents. 11 | def self.version 12 | '1.1.1.beta1' 13 | end 14 | 15 | # Initialize the events class by instantiating the class methods we'll be 16 | # using. 17 | def initialize(parent) 18 | @parent, @events = parent, {} 19 | end 20 | 21 | # Add a listener to the passed event type. You can pass a Proc, an array of 22 | # Proc's, or a block. 23 | def listen(event_type, procs = nil, &block) 24 | @events[event_type] = [] unless event_is_defined(event_type) 25 | procs_collected = [] 26 | if procs.respond_to?(:each) && procs.respond_to?(:to_a) 27 | procs_collected += procs.to_a 28 | elsif procs 29 | procs_collected << procs 30 | end 31 | procs_collected << block if block 32 | @events[event_type] += procs_collected 33 | end 34 | 35 | # Fire all registered listeners to the passed event, passing them the 36 | # arguments as provided. 37 | def fire(event_type, *arguments) 38 | @events[event_type].each do |event| 39 | event.call(*arguments) 40 | end if event_is_defined(event_type) 41 | end 42 | 43 | # Set an event to fire when passed method is called. This is useful for 44 | # adding callbacks or events to built-in methods. 45 | def fire_on_method(method, event_type, &block) 46 | if method.is_a? Array 47 | method.map { |sym| fire_on_method(sym, event_type, &block) } 48 | return 49 | end 50 | 51 | # We alias @parent to parent here, because class_eval can't see outside 52 | # this scope otherwise. 53 | parent, old_method = @parent, ('ruby_events_' + method.to_s + '_event_old').to_sym 54 | if parent && parent.respond_to?(method) 55 | parent.class.class_eval do 56 | # If the parent is already responding to the alias method, it means 57 | # the fire_on_method event was already triggered. Remove the other 58 | # event and continue if this happens. 59 | if parent.respond_to?(old_method, true) 60 | remove_method method 61 | alias_method method, old_method 62 | remove_method old_method 63 | end 64 | 65 | alias_method old_method, method 66 | private old_method 67 | 68 | # Make sure the self.send is at the end, or we won't return what we 69 | # are supposed to. 70 | define_method method do |*args| 71 | events.fire(event_type, *args) 72 | block.call(*args) if block # Calling the block we've been passed 73 | __send__(old_method, *args) 74 | end 75 | end 76 | else 77 | raise 'The given object does not respond to method you are trying to intercept calls to.' 78 | end 79 | end 80 | 81 | # Remove a method from the listening queue. 82 | def remove(event_type, event) 83 | @events[event_type].delete_if {|stored_event| stored_event == event} if event_is_defined(event_type) 84 | end 85 | 86 | # Remove a fire on method alias event. 87 | def remove_fire_on_method(method) 88 | parent, old_method = @parent, ('ruby_events_' + method.to_s + '_event_old').to_sym 89 | parent.class.class_eval do 90 | if parent.respond_to?(old_method, true) 91 | remove_method method 92 | alias_method method, old_method 93 | public method 94 | else 95 | raise 'The fire on method trigger you were trying to remove does not exist.' 96 | end 97 | end 98 | end 99 | 100 | private 101 | # Checks if an event of event_type is defined in the collection of events. 102 | def event_is_defined(event_type) 103 | @events.has_key?(event_type) 104 | end 105 | end 106 | end 107 | -------------------------------------------------------------------------------- /lib/ruby_events/object_patch.rb: -------------------------------------------------------------------------------- 1 | # Extending the Object class with the events accessor. 2 | class Object 3 | attr_writer :events 4 | 5 | # Attribute reader for the events accessor. Returns a new instance of the 6 | # events class if not defined, or the already defined class otherwise. 7 | def events 8 | @events ||= RubyEvents::Events.new(self) 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.1.gem -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.2.gem -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.3.gem -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.4.gem -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.5.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.5.gem -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.6.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.6.gem -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.7.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.7.gem -------------------------------------------------------------------------------- /pkg/ruby_events-0.0.8.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-0.0.8.gem -------------------------------------------------------------------------------- /pkg/ruby_events-1.0.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-1.0.0.gem -------------------------------------------------------------------------------- /pkg/ruby_events-1.0.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-1.0.1.gem -------------------------------------------------------------------------------- /pkg/ruby_events-1.1.0.beta.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-1.1.0.beta.gem -------------------------------------------------------------------------------- /pkg/ruby_events-1.1.0.beta2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-1.1.0.beta2.gem -------------------------------------------------------------------------------- /pkg/ruby_events-1.1.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathankleyn/ruby_events/44e05f8d018fe9aacb8787da46e45504895feda2/pkg/ruby_events-1.1.0.gem -------------------------------------------------------------------------------- /ruby_events.gemspec: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), 'lib/ruby_events') 2 | 3 | GEM_SPEC = Gem::Specification.new do |spec| 4 | spec.name = 'ruby_events' 5 | spec.version = RubyEvents::Events.version 6 | spec.extra_rdoc_files = ['README.markdown'] 7 | spec.summary = 'A really simple event implementation that hooks into the Object class by default, or can be used to extend modules and classes. Now all your objects can join in the fun of firing events!' 8 | spec.description = spec.summary + ' See http://github.com/nathankleyn/ruby_events for more information.' 9 | spec.author = 'Nathan Kleyn' 10 | spec.email = 'nathan@unfinitydesign.com' 11 | spec.homepage = 'http://github.com/nathankleyn/ruby_events' 12 | spec.files = %w(README.markdown Rakefile) + Dir.glob("{bin,lib,spec}/**/*") 13 | spec.require_path = "lib" 14 | spec.bindir = "bin" 15 | 16 | spec.add_development_dependency("rspec", "~>2.13.0") 17 | end 18 | -------------------------------------------------------------------------------- /spec/ruby_events_spec.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), '../lib/ruby_events/core') 2 | 3 | describe RubyEvents do 4 | 5 | it "should not patch object when only the core is required" do 6 | Object.respond_to?(:events).should be_false 7 | end 8 | 9 | it "should require the object patch seperate to the core" do 10 | require File.join(File.dirname(__FILE__), '../lib/ruby_events/object_patch').should be_true 11 | end 12 | 13 | it "should fire and handle an event correctly" do 14 | expect do 15 | example = Class.new() 16 | example.class_eval do 17 | attr_accessor :event_called 18 | 19 | def initialize 20 | events.listen(:test_event) do 21 | @event_called = true 22 | end 23 | end 24 | 25 | def call_me 26 | events.fire(:test_event) 27 | end 28 | end 29 | 30 | e = example.new 31 | e.call_me 32 | 33 | e.event_called.should be_true 34 | end.to_not(raise_error) 35 | end 36 | 37 | it "should fire a custom injected event for a native method" do 38 | expect do 39 | a, event_called = [], false 40 | 41 | class << a 42 | alias_method :inject_old, '<<'.to_sym 43 | 44 | def <<(item) 45 | events.fire(:injected, self, item) 46 | inject_old(item) 47 | end 48 | end 49 | 50 | a.events.listen(:injected) do |a, item| 51 | event_called = true 52 | end 53 | 54 | a << 'test' 55 | 56 | event_called.should be_true 57 | a.should include('test') 58 | end.to_not(raise_error) 59 | end 60 | 61 | it "should fire events on a method callback" do 62 | expect do 63 | p, block_called, proc_called, proc_a_called = Proc.new {}, false, false, false 64 | p.events.fire_on_method(:call, :called) 65 | p.events.listen(:called) do 66 | block_called = true 67 | end 68 | 69 | p.events.listen(:called, Proc.new { proc_called = true }) 70 | p.events.listen(:called, [Proc.new { proc_a_called = true }]) 71 | p.call 72 | 73 | block_called.should be_true 74 | proc_called.should be_true 75 | proc_a_called.should be_true 76 | end.to_not(raise_error) 77 | 78 | expect do 79 | a, event_called, event_item = [], false, nil 80 | a.events.fire_on_method('<<'.to_sym, :injected) 81 | a.events.listen(:injected) do |item| 82 | event_called, event_item = true, item 83 | end 84 | 85 | a << 'test' 86 | 87 | event_called.should be_true 88 | event_item.should == 'test' 89 | a.should include('test') 90 | end.to_not(raise_error) 91 | 92 | expect do 93 | a, b, event_called = {:one => 1}, {:two => 3}, false 94 | 95 | a.events.fire_on_method(:merge, :merged) 96 | a.events.listen(:merged) do |items| 97 | event_called, items[:three] = true, 3 98 | items 99 | end 100 | 101 | a = a.merge(b) 102 | 103 | event_called.should be_true 104 | a.should include(:three) 105 | end.to_not(raise_error) 106 | 107 | expect do 108 | a, b, event_called, block_called = {:one => 1}, {:two => 3}, false, false 109 | 110 | a.events.fire_on_method(:merge, :merged) do |items| 111 | block_called, items[:three] = true, 3 112 | end 113 | 114 | a.events.listen(:merged) do |items| 115 | event_called, items[:four] = true, 4 116 | items 117 | end 118 | 119 | a = a.merge(b) 120 | 121 | block_called.should be_true 122 | event_called.should be_true 123 | a.should include(:three) 124 | a.should include(:four) 125 | end.to_not(raise_error) 126 | end 127 | 128 | it "should fire two events when an array of symbols is passed to fire_on_method" do 129 | expect do 130 | a, calls = [], 0 131 | 132 | a.events.fire_on_method(["<<".to_sym, :push], :item_added) 133 | a.events.listen(:item_added) do 134 | calls += 1 135 | end 136 | 137 | a << "hello" 138 | a.push "world" 139 | 140 | calls.should == 2 141 | end.to_not(raise_error) 142 | end 143 | 144 | it "should not call a removed event" do 145 | expect do 146 | example = Class.new() 147 | example.class_eval do 148 | attr_accessor :event_called, :p 149 | 150 | def initialize 151 | @p = Proc.new { @event_called = true } 152 | events.listen(:test_event, @p) 153 | end 154 | 155 | def call_me 156 | events.fire(:test_event) 157 | end 158 | end 159 | 160 | e = example.new 161 | e.events.remove(:test_event, e.p) 162 | e.call_me 163 | 164 | e.event_called.should be_false 165 | end.to_not(raise_error) 166 | 167 | expect do 168 | a, b, event_called = {:one => 1}, {:two => 2}, false 169 | 170 | a.events.fire_on_method(:merge, :merged) 171 | a.events.listen(:merged) do |items| 172 | event_called = true 173 | end 174 | 175 | a.events.remove_fire_on_method(:merge) 176 | a = a.merge(b) 177 | 178 | event_called.should be_false 179 | end.to_not(raise_error) 180 | end 181 | end 182 | --------------------------------------------------------------------------------