./README in methodchain-0.2.2 vs ./README in methodchain-0.3.0
- old
+ new
@@ -5,24 +5,10 @@
== Author and License
Copyright (c) 2008 Greg Weber, http://gregweber.info
Licensed under the MIT license
== Examples
-=== ##tap
-if you don't already know about this method, look it up on the net. The tap included here allows message sending.
-
-==== old way
- arr = [1]
- arr.compact! # => nil
- arr.first # => 1
-
-==== normal ##tap (still valid)
- [1].tap {|arr| arr.compact!}.first # => 1
-
-==== new ##tap
- [1].tap(:compact!).first # => 1
-
=== ##then and ##else
==== old way
person = nil
name = person ? person.name : nil
@@ -34,23 +20,52 @@
==== old way
def find(*args)
# do some expensive database queries
end
- location = find(:first)
- @phone = location && location.phone # => nil
+ person = find(:first)
+ @phone = person && person.phone # => nil
==== new way
@phone = find(:first).then {phone} # => nil
We have reduced a line of code and removed a local variable.
#then and #else can return a default value instead of evaluating a block
'a'.then('b') #=> 'b'
nil.then('b').else('c') #=> 'c'
+=== ##tap
+if you don't already know about this method, look it up on the net. The tap included here allows message sending.
+
+==== old way
+ arr = [1]
+ arr.compact! # => nil
+ arr.first # => 1
+
+==== normal ##tap (still valid)
+ [1].tap {|arr| arr.compact!}.first # => 1
+
+==== new ##tap
+ [1].tap(:compact!).first # => 1
+
+==== normal ##tap (still valid)
+ [1].tap {|arr| arr.compact!}.tap {|arr| arr * 2}.first # => 1
+
+==== new ##tap
+ [1].tap( :compact!, [:*, 2] ).first # => 1
+
+You can also pass Procs as arguments
+ [1].tap( :compact!, lambda{|arr| arr * 2} ).first # => 1
+
+
=== ##chain
+chain is like tap, but instead of always returning self, it will return the result of the method call.
+ [1].chain(:first) == [1].first
+
+But there is an important difference- chain guards against certain results (by default it guards against nil and false)
+
==== old way
customer = nil
customer && customer.order && customer.order.id
==== new way
@@ -58,11 +73,11 @@
note that this is equivalent to
customer.then {order}.then {id}
-=== ##chain - Custom guards, multiple arguments, and procs
+=== ##chain - Custom guards, multiple arguments, and Procs
==== old way - guarding against zero
value = 0
result = if value == 0 then value else
tmp = value.abs
@@ -74,11 +89,11 @@
result # => 0
==== new way
value.chain(:abs, [:*, 20]) {|s| s == 0 } # => 0
-procs can be used, so this is equivalent to
+Procs can be used, so this is equivalent to
value.chain(:abs, lambda {|n| n * 20 }) {|s| s == 0 } # => 0
== Usage
require 'rubygems'
@@ -86,17 +101,48 @@
require 'methodchain'
=== selectively import MethodChain methods
- require 'methodchain/not_included'
+ require 'methodchain/not-included'
-not_included will load the MethodChain module without including it anywhere.
-Already have your own version of tap? use the module-import gem to decide what to include
+You can then include methodchain into selected classes, or you can use the module-import gem to include only certain methods
+ gem install module-import
+
+ require 'module-import'
+ class Object
+ import MethodChain, :chain # I only want Object#chain
+ end
+
+import will still load all the private methods from the module:
+- yield_or_eval
+- send_as_function
+- send_as_functions
+
+
+==== not into Object
+To import nothing into the Object namespace
+ require 'methodchain/no-import'
+
+Then include where needed:
+ class MyObject
+ include MethodChain
+ end
+
+
== Implementation
-* There are no proxy objects and no use of method_missing- these are simply function calls, so it should be fast.
-* A helper method called yield_or_eval is also exposed. This method allows the two different block forms {|p| p.name} and {name}, where the first form yields self and the second form is called using instance_eval.
+There are no proxy objects and no use of method_missing- these are simply function calls, so it should be fast.
+
+private methods:
+* yield_or_eval: allows the two different block forms {|p| p.name} and {name}, where the first form yields self and the second form is called using instance_eval.
+* send_as_function: allows symbols and arrays to be sent as messages, and calls yield_or_eval on Proc arguments
+* send_as_functions:
+
+ def send_arguments_as_functions *args
+ args.each {|arg| send_as_function arg}
+ self
+ end
== Install
gem install methodchain
== Source