Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
lib
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

MethodStruct

Tests

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

Releasing new version of gem

  1. Update version lib/method_struct/version.rb and push to master
  2. Create new GitHub release with tag name starting with v and the version, for example v0.3.0
  3. 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

About

No description, website, or topics provided.

Resources

License

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages

You can’t perform that action at this time.