Interfaceable
Impose interfaces on classes and let this gem automatically check that the interface constraints are met.
Installation
Add this line to your application's Gemfile:
gem 'interfaceable'
And then execute:
$ bundle install
Usage
In this example:
module Carrier
def call(number); end
def text(number, text); end
end
class Giffgaff
extend Interfaceable
implements Carrier
end
An attempt to load this code will result in the following error:
Giffgaff must implement: (Interfaceable::Error)
- Carrier#text
- Carrier#call
It will keep failing until Giffgaff
defines those methods.
Correctly! E.g.:
class Giffgaff
def call(number); end
def text(number, text = ''); end
end
Will fail because of method signature mismatch:
Giffgaff must implement correctly: (Interfaceable::Error)
- Carrier#text:
- expected arguments: (req, req)
- actual arguments: (req, opt=)
Rails
Mix in Interfaceable
before any of the application code is loaded. For example, in the initializer. For extra peace of mind, you can noop interface checking in production:
# config/initializers/interfaceable.rb
class Class
if Rails.env.production?
def implements(*args); end
else
include Interfaceable
end
end