Runaround
An Easy Callback System for Ruby Objects
Installation
Add gem 'runaround' to your Gemfile
Usage
Runaround can be used to add before, after, and around callbacks to your ruby objects.
Callbacks on a specific object instance
class Subtractor
include Runaround
def subtract(a,b)
a - b
end
end
object = Subtractor.new
object.runaround.before(:subtract){ |mc| mc.args.reverse! }
object.subtract(7,4)
=> -3
Subtractor.new.subtract(7,4)
=> 3Callbacks on class methods
class Formatter
extend Runaround
def self.format(string)
string.downcase.tr('[w m]', '[m w]')
end
runaround.after(:format){ |mc| mc.return_value += '!' }
end
Formatter.format('WALMART')
=> 'malwart!' Callbacks on instance methods
require 'json'
class Worker
extend Runaround::InstanceMethods
def work(**opts)
opts.to_json
end
irunaround.around(:work) do |mc|
puts " BEFORE WORK"
mc.opts[:foo_id] = 12345
result = mc.run_method
puts " WORK COMPLETE, GOT: #{result.inspect}"
end
end
worker = Worker.new
worker.work(thing: 'one')
BEFORE WORK
WORK COMPLETE, GOT: "{\"thing\":\"one\",\"foo_id\":12345}"
=> "{\"thing\":\"one\",\"foo_id\":12345}"More Details
Callbacks are passed a Runaround::MethodCall struct. This allows for manipulation of the input arguments/options as well as the return value. Be careful when using this functionality.
before and after callbacks are implemented using simple blocks, while around callbacks are implemented using Fibers.
As such, MethodCall#run_method is only used for around callbacks. All around callbacks must call it.
Development
After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/fledman/runaround.
License
The gem is available as open source under the terms of the MIT License.