Python's function decorators for Ruby.
gem install method_decorators
Using a decorator
Extend MethodDecorators in a class where you want to use them, and then stick
+DecoratorName before your method declaration to use it.
class Math extend MethodDecorators +Memoized def fib(n) if n <= 1 1 else fib(n - 1) * fib(n - 2) end end end
You can also decorate with an instance of a decorator, rather than the class. This is useful for configuring specific options for the decorator.
class ExternalService extend MethodDecorators +Retry.new(3) def request ... end end
Include these with
require 'method_decorators/decorators/name_of_decorator', or all at once with
- Memoize - caches the result of the method for each arg combination it's called with
- Retry - retries the method up to n (passed in to the constructor) times if the method errors
- Precondition - raises an error if the precondition (passed as a block) is not met
Defining a decorator
class Transactional < MethodDecorator def call(wrapped, *args, &blk) ActiveRecord::Base.transaction do wrapped.call(*args, &blk) end end end
MethodDecorators is available under the MIT license and is freely available for all use, including personal, commercial, and academic. See LICENSE for details.