MethodStruct
Facilitates extracting large methods into objects - see Usage. For a more in-depth treatment of the refactoring see http://sourcemaking.com/refactoring/replace-method-with-method-object. You can also take a look at http://www.bunsch.pl/2014/10/14/wrangling-service-objects-with-method_struct/ for an exmaple of usage in a Rails app.
Installation
Add this line to your application's Gemfile:
gem 'method_struct'
And then execute:
$ bundle
Or install it yourself as:
$ gem install method_struct
Usage
Say you have this:
class UsersController
def create
User.create(:email => params[:email], :name => params[:name])
Mailer.registration_email(params[:email]).deliver
end
end
You can change it into this:
class Registrator < MethodStruct.new(:email, :name)
def call
create_user!
send_email!
end
private
def create_user!
User.create(:email => email, :name => name)
end
def send_email!
Mailer.registration_email(:email).deliver
end
end
class UsersController
def create
Registrator.call(params[:email], params[:name])
# Or
Registrator.call(:email => params[:email], :name => params[:name])
# Or - thanks to ruby changing [] into .call
Registrator[params[:email], params[:name]]
end
end
You can also specify a different method name like so:
class Registrator < MethodStruct.new(:email, :name, :method_name => :register)
def register
# ...
end
end
class UsersController
def create
Registrator.register(params[:email], params[:name])
end
end
You can use :require_all => true
if you want to verify that all arguments
have been specified or :require_presence => true
to verify that all arguments
are non-nil. Global defaults for these options can be changed like so:
MethodStruct::Defaults.set(
:require_presence => true,
:method_name => :do_it
)
Method struct currently also supports a do
syntax, but it is discouraged (and may get depracated)
due to odd constant scoping. Example:
Registrator = MethodStruct.new(:email, :name) do
REGISTRATION_PATH = "/register" # this is now a top-level constant
def call
...
end
end
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
Releasing new version of gem
- Update version lib/method_struct/version.rb and push to
master
- Create new GitHub release with tag name starting with
v
and the version, for examplev0.3.0
- Gem will be automatically built and pushed to rubygems.org with GitHub Action
Copyright and license
Copyright 2013 Zendesk
Licensed under the Apache License, Version 2.0