unobservable 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +85 -2
- data/Rakefile +1 -0
- data/TODO.rdoc +5 -0
- data/VERSION +1 -1
- data/lib/unobservable.rb +5 -0
- metadata +3 -2
data/README.rdoc
CHANGED
@@ -1,9 +1,92 @@
|
|
1
1
|
= unobservable
|
2
2
|
|
3
3
|
Ruby's Observable mixin is often characterized as an Event Handler library. In reality, it only provides basic
|
4
|
-
support for "Property Changed" notifications.
|
4
|
+
support for "Property Changed" notifications. If an object needs to raise several different types of events,
|
5
|
+
then the Observable mixin is the wrong tool for the job.
|
5
6
|
|
6
|
-
Unobservable
|
7
|
+
Unobservable overcomes the limitations of the Observable mixin by allowing objects to own one or more Event
|
8
|
+
objects.
|
9
|
+
|
10
|
+
== 2-Minute Tour
|
11
|
+
|
12
|
+
Instead of a lengthy introduction, here's a short program that demonstrates the main concepts:
|
13
|
+
|
14
|
+
|
15
|
+
require 'unobservable'
|
16
|
+
|
17
|
+
|
18
|
+
class Button
|
19
|
+
# This will add basic support for Events to this class. As a bonus, it will
|
20
|
+
# also make the attr_event keyword available to us.
|
21
|
+
include Unobservable::Support
|
22
|
+
|
23
|
+
# The attr_event keyword allows us to declare the Events that are available
|
24
|
+
# to the instances of the Button class.
|
25
|
+
attr_event :clicked, :double_clicked
|
26
|
+
|
27
|
+
|
28
|
+
# This method will raise the :clicked event when it is invoked.
|
29
|
+
def click(x, y)
|
30
|
+
raise_event(:clicked, x, y)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
# This method will raise the :double_clicked event when it is invoked
|
35
|
+
def double_click(x, y)
|
36
|
+
raise_event(:double_clicked, x, y)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# This class does not publish any events, so it does not need to include
|
42
|
+
# the Unobserable::Support mixin.
|
43
|
+
class Textbox
|
44
|
+
attr_accessor :text
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# Now let's create some instances of these classes
|
49
|
+
button = Button.new
|
50
|
+
textbox = Textbox.new
|
51
|
+
|
52
|
+
|
53
|
+
# We want to automatically update the textbox's text whenever we click
|
54
|
+
# the button. So, let's register an event handler:
|
55
|
+
button.clicked.register do |x, y|
|
56
|
+
textbox.text = "You just clicked: #{x} #{y}"
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# We want to print the [x, y] coordinates to the console whenever the
|
61
|
+
# button is double-clicked. So, we can register an event handler that
|
62
|
+
# just calls the Kernel#puts method directly.
|
63
|
+
button.double_clicked.register Kernel, :puts
|
64
|
+
|
65
|
+
|
66
|
+
# Show time! First, let's print the textbox's text just to verify
|
67
|
+
# that it's currently null:
|
68
|
+
puts "Before Clicking: #{textbox.text}"
|
69
|
+
|
70
|
+
# Now click the button. This should raise the :clicked event, which
|
71
|
+
# will invoke its event handlers:
|
72
|
+
button.click(2, 3)
|
73
|
+
|
74
|
+
|
75
|
+
# As expected, the event handler that we registered to the :clicked
|
76
|
+
# event updated the textbox's text.
|
77
|
+
puts "After Clicking: #{textbox.text}"
|
78
|
+
|
79
|
+
|
80
|
+
# Now double-click the button. This should raise the :double_clicked
|
81
|
+
# event, which will invoke its event handlers. As a result, the
|
82
|
+
# coordinates will be printed to the console.
|
83
|
+
button.double_click(15, 2)
|
84
|
+
|
85
|
+
|
86
|
+
# We did not register any event handlers that would change the textbox
|
87
|
+
# when the button was double-clicked. Therefore, we should find that
|
88
|
+
# the textbox's text has remained unchanged.
|
89
|
+
puts "After Double-Clicking: #{textbox.text}"
|
7
90
|
|
8
91
|
|
9
92
|
== Usage
|
data/Rakefile
CHANGED
data/TODO.rdoc
ADDED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
data/lib/unobservable.rb
CHANGED
@@ -114,6 +114,7 @@ module Unobservable
|
|
114
114
|
|
115
115
|
|
116
116
|
|
117
|
+
# Minimalistic Event implementation
|
117
118
|
class Event
|
118
119
|
attr_reader :handlers
|
119
120
|
|
@@ -147,6 +148,10 @@ module Unobservable
|
|
147
148
|
end
|
148
149
|
|
149
150
|
|
151
|
+
# Removes a single instance of the specified event handler
|
152
|
+
# from the list of event handlers. Therefore, if you've
|
153
|
+
# registered the same event handler 3 times, then you will
|
154
|
+
# need to unregister it 3 times as well.
|
150
155
|
def unregister(*args, &block)
|
151
156
|
h = handler_for(*args, &block)
|
152
157
|
index = @handlers.index(h)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unobservable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- LICENSE.txt
|
89
89
|
- README.rdoc
|
90
90
|
- Rakefile
|
91
|
+
- TODO.rdoc
|
91
92
|
- VERSION
|
92
93
|
- lib/unobservable.rb
|
93
94
|
- test/helper.rb
|
@@ -107,7 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
108
|
version: '0'
|
108
109
|
segments:
|
109
110
|
- 0
|
110
|
-
hash:
|
111
|
+
hash: 1737406497350544853
|
111
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
113
|
none: false
|
113
114
|
requirements:
|