delegate_to_instance
Helper for single purpose objects
Usage
Instead of
class SendInvoiceJob
def self.perform(invoice_id, recipients)
new(invoice_id, recipients).perform
end
def initialize(invoice_id, recipients)
@invoice_id, @recipients = invoice_id, recipients
end
def perform
send_invoice(invoice_id, recipients)
end
endjust write
class SendInvoiceJob
extend DelegateToInstance
delegate_to_instance :perform
def initialize(invoice_id, recipients)
@invoice_id, @recipients = invoice_id, recipients
end
def perform
send_invoice(invoice_id, recipients)
end
endWhy
When I write single purpose objects, like
class HTMLSanitizer
def self.sanitize(html)
new(html).sanitize
end
def initialize(html)
@html = html
end
def sanitize
sanitize_html(html)
end
endI often find myself writing a class level delegator (and corresponding tests for it)
class HTMLSanitizer
def self.sanitize(html)
new(html).sanitize
end
# ...Instead, just write
class HTMLSanitizer
include DelegateToInstance
delegate_to_instance :sanitize
# ...Installation
Add this line to your application's Gemfile:
gem 'delegate_to_instance'And then execute:
$ bundle
Or install it yourself as:
$ gem install delegate_to_instance
TODO
- Add a RSpec matcher