Skip to content

fledman/runaround

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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)
 => 3

Callbacks 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.

About

Easy Callback System for Ruby Objects

Resources

License

Stars

Watchers

Forks

Packages

No packages published