Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
!!Will the original author of this code please stand up? ##ho_enumerable.rb require 'delegate' module HOM class HigherOrderMessage def HigherOrderMessage.is_vital(method) return method =~ /__(.+)__|method_missing/ end for method in instance_methods undef_method(method) unless is_vital(method) end def initialize(handler) @handler = handler end end class Do < HigherOrderMessage def method_missing(id, *args) @handler.each {|e| e.__send__(id,*args)} return nil end end class Are < HigherOrderMessage def method_missing(id, *args) return @handler.apply {|e| e.__send__(id,*args)} end end class AreNot < HigherOrderMessage def method_missing(id, *args) return @handler.apply {|e| not e.__send__(id,*args)} end end class Have < HigherOrderMessage def method_missing(id, *args) return ResultMatcher.new(@handler,id,args) end end class ResultMatcher < HigherOrderMessage def initialize(handler, method, args) super(handler) @method = method @args = args end def method_missing(id, *args) @handler.apply do |e| result = e.__send__(@method,*@args) result.__send__(id,*args) end end end class Sort < HigherOrderMessage def method_missing(id, *args) return @handler.sort do |e1, e2| v1 = e1.__send__(id,*args) v2 = e2.__send__(id,*args) v1 <=> v2 end end end class ReverseSort < HigherOrderMessage def method_missing(id, *args) return @handler.sort do |e1, e2| v1 = e1.__send__(id,*args) v2 = e2.__send__(id,*args) v2 <=> v1 end end end class Extract < HigherOrderMessage def method_missing(id, *args) return @handler.map {|e| e.__send__(id, *args)} end end class Collator def initialize(receiver) @receiver = receiver end def are return HOM::Are.new(self) end def are_not return HOM::AreNot.new(self) end def have return HOM::Have.new(self) end end class That < Collator def apply(&block) return @receiver.select(&block) end end class All < Collator def apply(&block) return @receiver.all?(&block) end end class Any < Collator def apply(&block) return @receiver.any?(&block) end end # under Rails 1.2.1, I get errors trying to render the template error message if I have this defined # class Sum < HigherOrderMessage # def method_missing(id, *args) # total = 0 # @handler.each {|e| total = total + e.__send__(id, *args) } # return total # end # end end module Enumerable def do return HOM::Do.new(self) end def that return HOM::That.new(self) end def all return HOM::All.new(self) end def any return HOM::Any.new(self) end def in_order_of return HOM::Sort.new(self) end def in_reverse_order_of return HOM::ReverseSort.new(self) end def as(a_class) return collect {|e| a_class.new(e)} end def extract return HOM::Extract.new(self) end # under Rails 1.2.1, I get errors trying to render the template error message if I have this defined # def sum # return HOM::Sum.new(self) # end end
This paste will be private.
From the Design Piracy series on my blog: