andand 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- == 1.1.0 2008-02-03
1
+ == 1.3.0 2008-07-12
2
2
 
3
3
  * 1 major enhancement:
4
4
  * Initial release
@@ -10,3 +10,5 @@
10
10
  * Object#dont
11
11
  * 5 bug fix
12
12
  * Plays well with other patch-artists
13
+ * 6 minor enhancement
14
+ * uses existing BlankSlate class if already defined
@@ -2,8 +2,24 @@ $:.unshift File.dirname(__FILE__)
2
2
 
3
3
  module AndAnd
4
4
 
5
+ # This module is included in Object, so each of these methods are added
6
+ # to Object when you require 'andand'. Each method is an *adverb*: they are
7
+ # intended to be enchained with another method, such as receiver.adverb.method
8
+ #
9
+ # The purpose of an adverb is to modify what the primary method returns.
10
+ #
11
+ # Adverbs also take blocks or procs, passing the receiver as an argument to the
12
+ # block or proc. They retain the same semantics with a block or proc as they
13
+ # do with a method. This behaviour weakly resembles a monad.
5
14
  module ObjectGoodies
6
15
 
16
+ # Returns nil if its receiver is nil, regardless of whether nil actually handles the
17
+ # actual method ot what it might return.
18
+ #
19
+ # 'foo'.andand.size => 3
20
+ # nil.andand.size => nil
21
+ # 'foo'.andand { |s| s << 'bar' } => 'foobar'
22
+ # nil.andand { |s| s << 'bar' } => nil
7
23
  def andand (p = nil)
8
24
  if self
9
25
  if block_given?
@@ -21,7 +37,24 @@ module AndAnd
21
37
  end
22
38
  end
23
39
  end
24
-
40
+
41
+ # Invokes the method and returns the receiver if nothing is raised. Therefore,
42
+ # the purpose of calling the method is strictly for side effects. In the block
43
+ # form, it resembles #tap from Ruby 1.9, and is useful for debugging. It also
44
+ # resembles #returning from Rails, with slightly different syntax.
45
+ #
46
+ # Object.new.me do |o|
47
+ # def o.foo
48
+ # 'foo'
49
+ # end
50
+ # end
51
+ # => your new object
52
+ #
53
+ # In the method form, it is handy for chaining methods that don't ordinarily
54
+ # return the receiver:
55
+ #
56
+ # [1, 2, 3, 4, 5].me.pop.reverse
57
+ # => [4, 3, 2, 1]
25
58
  def me (p = nil)
26
59
  if block_given?
27
60
  yield(self)
@@ -34,8 +67,19 @@ module AndAnd
34
67
  end
35
68
  end
36
69
 
37
- alias :tap :me
70
+ unless Object.instance_methods.include?('tap')
71
+ alias :tap :me
72
+ end
38
73
 
74
+ # Does not invoke the method or block and returns the receiver.
75
+ # Useful for comemnting stuff out, especially if you are using #me for
76
+ # debugging purposes: change the .me to .dont and the semantics of your
77
+ # program are unchanged.
78
+ #
79
+ # [1, 2, 3, 4, 5].me { |x| p x }
80
+ # => prints and returns the array
81
+ # [1, 2, 3, 4, 5].dont { |x| p x }
82
+ # => returns the array without printing it
39
83
  def dont (p = nil)
40
84
  if block_given?
41
85
  self
@@ -53,26 +97,41 @@ end
53
97
  class Object
54
98
  include AndAnd::ObjectGoodies
55
99
  end
100
+
101
+ unless Module.constants.include?('BlankSlate')
102
+ module AndAnd
103
+ class BlankSlate
104
+ def self.wipe
105
+ instance_methods.reject { |m| m =~ /^__/ }.each { |m| undef_method m }
106
+ end
107
+ def initialize
108
+ BlankSlate.wipe
109
+ end
110
+ end
111
+ end
112
+ end
56
113
 
57
114
  module AndAnd
58
115
 
59
- class BlankSlate
60
- def self.wipe
61
- instance_methods.reject { |m| m =~ /^__/ }.each { |m| undef_method m }
62
- end
116
+ # A proxy that returns its target without invoking the method you
117
+ # invoke. Useful for nil.andand and #dont
118
+ class MockReturningMe < BlankSlate
63
119
  def initialize(me)
64
- BlankSlate.wipe
120
+ super()
65
121
  @me = me
66
122
  end
67
- end
68
-
69
- class MockReturningMe < BlankSlate
70
123
  def method_missing(*args)
71
124
  @me
72
125
  end
73
126
  end
74
-
127
+
128
+ # A proxy that returns its target after invoking the method you
129
+ # invoke. Useful for #me
75
130
  class ProxyReturningMe < BlankSlate
131
+ def initialize(me)
132
+ super()
133
+ @me = me
134
+ end
76
135
  def method_missing(sym, *args, &block)
77
136
  @me.__send__(sym, *args, &block)
78
137
  @me
@@ -1,8 +1,8 @@
1
1
  module Andand #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
- MINOR = 2
5
- TINY = 1
4
+ MINOR = 3
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -33,7 +33,7 @@
33
33
  <h1>Object#andand</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/andand"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/andand" class="numbers">1.2.1</a>
36
+ <a href="http://rubyforge.org/projects/andand" class="numbers">1.3.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;andand&#8217;</h1>
39
39
 
@@ -217,7 +217,7 @@
217
217
 
218
218
  <p>Comments are welcome. Send an email to <a href="mailto:raganwald+rubyforge@gmail.com">Reginald Braithwaite</a>.</p>
219
219
  <p class="coda">
220
- <a href="http://weblog.raganwald.com">Reginald Braithwaite</a>, 6th April 2008<br>
220
+ <a href="http://weblog.raganwald.com">Reginald Braithwaite</a>, 12th July 2008<br>
221
221
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
222
222
  </p>
223
223
  </div>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: andand
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reginald Braithwaite
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-10 00:00:00 -04:00
12
+ date: 2008-07-13 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15