Prefer SimpleDelegator over method_missing for wrapper classes
If you find yourself needing to make a light wrapper for an object to extend it with new methods, prefer using the standard
library’s SimpleDelegator
over implementing method_missing
to reduce boilerplate.
Note that this pattern only applies to plain Ruby wrappers.
Bad 🔗
class Wrapper
def initialize(wrapped)
@wrapped = wrapped
end
def expired?
wrapped.fetch(:expired_at) > Time.now
end
def method_missing(meth, ...)
if wrapped.respond_to?(meth)
wrapped.send(meth, ...)
else
raise NotImplemented
end
end
def respond_to_missing?(meth)
wrapped.respond_to?(meth)
end
private
attr_reader :wrapped
end
Good 🔗
class Wrapper < SimpleDelegator
attr_reader :wrapped
def initialize(wrapped)
super(wrapped)
@wrapped = wrapped
end
def expired?
wrapped.fetch(:expired_at) > Time.now
end
end