No description, website, or topics provided.
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
spec
.gitignore
.travis.yml
CHANGELOG
Gemfile
LICENSE.txt
README.md
Rakefile
method_struct.gemspec

README.md

MethodStruct

Build Status

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

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request