ValueProtocol
Allows passing any object where a block is expected.
It is inspired by the way Smalltalk deals with the same scenario, making use of the #value message.
Motivation
I wrote this gem to avoid having to wrap objects inside lambdas (and thus, avoid repeating code) when working with messages like :detect.
I wanted to turn this:
numbers.detect(lambda{ 2 }) { |number| number.even? }Into something like this, reducing the noise introduced by the lambda part:
numbers.detect(2) { |number| number.even? }Also, I wanted to be able to pass any object when an implicit block is expected:
# create an instance of a complex condition
even_numbers = EvenNumberConition.new
numbers.select &even_numbersHow does it works?
Basically, it works by implementing :call (returning self), and implementing :to_proc (returning a proc that evaluates self.call) in Object.
It sound more complicated than it really is. Take a look at the implementation and specs!
Usage
Just pass any object where a block is expected (respecting the & operator when needed). That's all.
If you want to implement custom behavior, override the :call method in your class (remember to respect the signature!).
For most scenarios, you won't need to override :to_proc.
Feel like reading a blog post?
Check this out! Rock Your Ruby: The Value of Value
Installation
Add this line to your application's Gemfile:
gem 'value_protocol'
And then execute:
$ bundle
Or install it yourself as:
$ gem install value_protocol
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request