Skip to content

maxp-edcast/metaprogrammer

Repository files navigation

Metaprogrammer


Install

Install from rubygems, the gem is named 'metaprogrammer'.

Usage

Metaprogrammer is a module. There are two main methods it exposes:

  • patch_class_methods
  • patch_instance_methods.

There is also a patch_all_methods method that has the same signature as the other two, and calls them both.

An example usage looks like this:

class MyClass
  extend Metaprogrammer
  def foo
    1
  end
  def self.foo
    1
  end
end

MyClass.patch_all_methods do |orig_method, **args, &blk|
  orig_method.call(**args, &blk) + 1
end

MyClass.foo # => 2
MyClass.new.foo # => 2

You can manipulate the arguments or the return value.

A couple example usages are included with the gem:

# Rescue all errors
MyClass.rescue_all_methods(RuntimeError) do |error|
  puts "#{error.class} was raised!"
end

# Memoize all methods
MyClass.memoize # memoizes all methods.

The implementations of these methods are pretty simple (assuming these are called in class scope of the method which extends Metaprogrammer)

# rescue all methods
patch_all_methods do |orig_method, *args, &caller_blk|
  begin
    orig_method.call *args, &caller_blk
  rescue *exceptions => e
    blk.call(e)
  end
end

# memoize methods
patch_all_methods do |orig_method, *args, &caller_blk|
  memos = @_memoized_methods ||= {}
  method_memos = @_memoized_methods[orig_method] ||= {}
  method_memos[args] ||= orig_method.call *args, &caller_blk
end

patch_all_methods, patch_class_methods, and patch_instance_methods can all be configured with only: and except: options. These should be given as arrays of symbols corresponding to method names.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages