<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: metaprogramming code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 11 May 2008 08:27:39 GMT</pubDate>
    <description>DZone Snippets: metaprogramming code</description>
    <item>
      <title>using object(s) do ...</title>
      <link>http://snippets.dzone.com/posts/show/5347</link>
      <description>A little meta-hack that allows one to temporarily assign one or more objects into the scope of a block. My thanks to vinterbleg for optimizing it.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def using (*args)&lt;br /&gt;  yield *args&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For (a rather half-assed) example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt; using [10,20,30], 40 do |x,y|&lt;br /&gt;&gt;&gt;   x &lt;&lt; y if y.is_a? Fixnum&lt;br /&gt;&gt;&gt;   puts x.to_s&lt;br /&gt;&gt;&gt; end&lt;br /&gt;10203040&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 11 Apr 2008 14:31:22 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5347</guid>
      <author>bleeder (Robin Kaarsgaard)</author>
    </item>
    <item>
      <title>With object do...</title>
      <link>http://snippets.dzone.com/posts/show/5321</link>
      <description>This code enters the scope of an object, so you can temporarily avoid having to reference it by name.&lt;br /&gt; &lt;br /&gt;Effectively changes the value of 'self' in the block scope. This also enables you to run private methods on the object without using __send__.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def with(object, &amp;block)&lt;br /&gt;    object.instance_eval(&amp;block)&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example of usage:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;numbers = [1, 2, 3]&lt;br /&gt;&lt;br /&gt;with numbers do&lt;br /&gt;	map! { |n| n + 100 }&lt;br /&gt;	reject! { |n| n % 2 == 0}&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;p numbers # =&gt; [101, 103]&lt;br /&gt;&lt;br /&gt;n = 15&lt;br /&gt;n = with n do&lt;br /&gt;    self + 13&lt;br /&gt;end&lt;br /&gt;p n # =&gt; 28&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This gets much more interesting with complex objects that have lots of attributes and you want strict control over how they're set.</description>
      <pubDate>Thu, 03 Apr 2008 11:03:54 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5321</guid>
      <author>vinterbleg (Simon Ask Ulsnes)</author>
    </item>
    <item>
      <title>Acts as Java Class Variable</title>
      <link>http://snippets.dzone.com/posts/show/4394</link>
      <description>// Ruby's Class Variable is soooooooooooooooo confusing&lt;br /&gt;// http://www.oreillynet.com/ruby/blog/2007/01/nubygems_dont_use_class_variab_1.html&lt;br /&gt;// However, if we use &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;module JCV&lt;br /&gt;  def self.included(the_class)&lt;br /&gt;    class &lt;&lt; the_class&lt;br /&gt;      def acts_like_java_class_variable( *arg)&lt;br /&gt;&lt;br /&gt;        the_class = self&lt;br /&gt;        singleton_class = class &lt;&lt; self; self; end&lt;br /&gt;        arg.each do |var|&lt;br /&gt;          singleton_class.send :define_method, "#{var}",&lt;br /&gt;                               &amp; lambda{ the_class.send "__real_#{var}"}&lt;br /&gt;          singleton_class.send :define_method, "#{var}=",&lt;br /&gt;                               &amp; lambda{|c| the_class.send "__real_#{var}=",c}&lt;br /&gt;          singleton_class.send :define_method, "__real_#{var}",&lt;br /&gt;                               &amp; lambda{ instance_variable_get "@#{var}"}&lt;br /&gt;          singleton_class.send :define_method, "__real_#{var}=",&lt;br /&gt;                               &amp; lambda{|c| instance_variable_set "@#{var}", c}&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class A&lt;br /&gt;  include JCV&lt;br /&gt;  acts_like_java_class_variable :count&lt;br /&gt;&lt;br /&gt;  @count = 0&lt;br /&gt;  def initialize&lt;br /&gt;    A.count +=1&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 06 Aug 2007 03:47:25 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4394</guid>
      <author>contagion (ZuNien Lin)</author>
    </item>
    <item>
      <title>Wrap all methods of an object</title>
      <link>http://snippets.dzone.com/posts/show/4087</link>
      <description>Given an existing object "obj", wraps all of its methods.  In this case, the wrapper prints a log of the method invocation, and the call stack of the call, but you can modify it to do anything...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;virtual_class = class &lt;&lt;obj; self; end&lt;br /&gt;&lt;br /&gt;virtual_class.class_eval {&lt;br /&gt;  obj.methods.each { |method|&lt;br /&gt;    the_alias = method.gsub(/([^?]+)(\??)/, "\\1_orig\\2").to_sym&lt;br /&gt;    alias_method the_alias, method&lt;br /&gt;&lt;br /&gt;    define_method(method) { |*args|&lt;br /&gt;        args_str = args.map { |a| a.inspect }.join(", ")&lt;br /&gt;        unless method == "to_s"&lt;br /&gt;          puts "#{self.inspect_orig}.#{method}(#{args_str}) called from #{caller.inspect}"&lt;br /&gt;        end&lt;br /&gt;        self.send_orig(the_alias, *args)&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 31 May 2007 23:23:12 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4087</guid>
      <author>haberman (Joshua Haberman)</author>
    </item>
    <item>
      <title>Attribute Cache</title>
      <link>http://snippets.dzone.com/posts/show/4002</link>
      <description>Sometimes, you don't want to calculate the value of an attribute every time--like the sum of an array.  However, you don't want it cached on the outside of the object since that makes for messy code.  But you seem to cache things over and over again inside objects.  Here's a module AttributeCache that does a little meta programming to make attribute caching a little bit easier.  more details at &lt;a href="http://webjazz.blogspot.com/2007/05/ruby-snippet-caching-object-attributes.html"&gt;http://webjazz.blogspot.com/2007/05/ruby-snippet-caching-object-attributes.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;module AttributeCache&lt;br /&gt;&lt;br /&gt;  def metaclass; class &lt;&lt; self; self; end; end&lt;br /&gt;  &lt;br /&gt;  def cache(attr_name, options)&lt;br /&gt;    instance_variable_set "@#{attr_name}", options[:initial]&lt;br /&gt;    instance_variable_set "@#{:sum}_outdated", true&lt;br /&gt;&lt;br /&gt;    metaclass.instance_eval do &lt;br /&gt;      define_method("outdate_#{attr_name}") do&lt;br /&gt;        puts "in outdated"&lt;br /&gt;        instance_variable_set "@#{attr_name}_outdated", true&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    metaclass.class_eval %Q{&lt;br /&gt;      def cached_#{attr_name}(&amp;block)&lt;br /&gt;        if @#{attr_name}_outdated&lt;br /&gt;          puts "in cached to update!"&lt;br /&gt;          @#{attr_name}_outdated = false&lt;br /&gt;          @#{attr_name} = block.call&lt;br /&gt;        else&lt;br /&gt;          puts "in cached to give cache!"&lt;br /&gt;        end&lt;br /&gt;        return @#{attr_name}&lt;br /&gt;      end&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Collection&lt;br /&gt;  include AttributeCache&lt;br /&gt;&lt;br /&gt;  def initialize&lt;br /&gt;    @array = []&lt;br /&gt;    cache :sum, :initial =&gt; 0&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def add(x)&lt;br /&gt;    outdate_sum&lt;br /&gt;    @array &lt;&lt; x&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def sum&lt;br /&gt;    cached_sum { @array.inject {|t, e| t += e} }&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;c = Collection.new&lt;br /&gt;puts c.public_methods(false).inspect&lt;br /&gt;c.add(2)&lt;br /&gt;c.add(3)&lt;br /&gt;puts c.sum&lt;br /&gt;puts c.sum&lt;br /&gt;c.add(4)&lt;br /&gt;puts c.sum&lt;br /&gt;puts c.sum&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 13 May 2007 13:45:43 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4002</guid>
      <author>iamwil (wilhelm)</author>
    </item>
    <item>
      <title>method triggers: instead, before, after</title>
      <link>http://snippets.dzone.com/posts/show/3620</link>
      <description>Redefine method calls, in manner similar to SQL triggers and PostgreSQL rules - i.e. execute code block instead, before or after call to original method. rules can be appended and removed.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Object&lt;br /&gt;&lt;br /&gt;  def self.__rules__&lt;br /&gt;  # container for defined rules, each item is:&lt;br /&gt;  #   [class, event_name, method_name, alias_for_original_method, caller, comment]&lt;br /&gt;    @@rules ||= []&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.__create_rule_instead( method, comment = '', &amp;block) # creates and returns new rule&lt;br /&gt;    b_id = "%04x" % block.object_id&lt;br /&gt;    old_method_name = :"__previous_#{method}_#{b_id}"&lt;br /&gt;    alias_method old_method_name, method&lt;br /&gt;    define_method method, &amp;block&lt;br /&gt;    __rules__ &lt;&lt; rule = [self, "INSTEAD", method, old_method_name,caller[0], comment ]&lt;br /&gt;    rule&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.__create_rule_before( method, comment = '', &amp;block)&lt;br /&gt;    args = instance_method(method).arity == 0 ? '' : '(*args)'&lt;br /&gt;    b_id = "%04x" % block.object_id&lt;br /&gt;    old_method_name = :"__previous_#{method}_#{b_id}"&lt;br /&gt;    alias_method old_method_name, method&lt;br /&gt;    define_method :"__before_#{method}_#{b_id}", &amp;block&lt;br /&gt;    class_eval &lt;&lt;-EOT&lt;br /&gt;      def #{method}#{args}&lt;br /&gt;        __before_#{method}_#{b_id}#{args}&lt;br /&gt;        __previous_#{method}_#{b_id}#{args}&lt;br /&gt;      end&lt;br /&gt;    EOT&lt;br /&gt;    __rules__ &lt;&lt; rule = [self, "BEFORE", method, old_method_name, caller[0], comment]&lt;br /&gt;    rule&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.__create_rule_after( method, comment = '', &amp;block)&lt;br /&gt;    args = instance_method(method).arity == 0 ? '' : '(*args)'&lt;br /&gt;    b_id = "%04x" % block.object_id&lt;br /&gt;    old_method_name = :"__previous_#{method}_#{b_id}"&lt;br /&gt;    alias_method old_method_name, method&lt;br /&gt;    define_method :"__after_#{method}_#{b_id}", &amp;block&lt;br /&gt;    class_eval &lt;&lt;-EOT&lt;br /&gt;      def #{method}#{args}&lt;br /&gt;        res = __previous_#{method}_#{b_id}#{args}&lt;br /&gt;        __after_#{method}_#{b_id}#{args}&lt;br /&gt;        res&lt;br /&gt;      end&lt;br /&gt;    EOT&lt;br /&gt;    __rules__ &lt;&lt; rule = [self, "AFTER", method, old_method_name,caller[0], comment ]&lt;br /&gt;    rule&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.__remove_rule( rule ) # has some bugs when rules on subclasses are defined :(&lt;br /&gt;    idx = __rules__.index(rule)&lt;br /&gt;    if idx&lt;br /&gt;      # look for next rule for the same method&lt;br /&gt;      idx += 1&lt;br /&gt;      while idx &lt; __rules__.size&lt;br /&gt;        break if  __rules__[idx][2] == rule[2] &amp;&amp; __rules__[idx][0] == rule[0]&lt;br /&gt;        idx+=1&lt;br /&gt;      end&lt;br /&gt;      if idx &lt; __rules__.size&lt;br /&gt;        next_rule = __rules__[idx]&lt;br /&gt;        next_rule[0].send :remove_method, next_rule[3]&lt;br /&gt;        next_rule[0].send :alias_method, next_rule[3], rule[3]&lt;br /&gt;      else&lt;br /&gt;        # that was last&lt;br /&gt;        rule[0].send :remove_method, rule[2]&lt;br /&gt;        rule[0].send :alias_method, rule[2], rule[3]&lt;br /&gt;      end&lt;br /&gt;      __rules__.delete(rule)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Model&lt;br /&gt;  def save&lt;br /&gt;    puts "save"&lt;br /&gt;  end&lt;br /&gt;  def reload(flag)&lt;br /&gt;    "reloaded"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;r1 = Model.__create_rule_instead(:reload) {|flag| flag ? "FRESH" : "STALE" }&lt;br /&gt;&lt;br /&gt;obj = Model.new&lt;br /&gt;&lt;br /&gt;puts "RELOAD:"+obj.reload(true)&lt;br /&gt;puts "RELOAD:"+obj.reload(false)&lt;br /&gt;&lt;br /&gt;Object.__remove_rule(r1)&lt;br /&gt;puts "RELOAD:"+obj.reload(false)&lt;br /&gt;&lt;br /&gt;Model.__create_rule_before(:save) { puts "BEFORE SAVE" }&lt;br /&gt;r2 = Model.__create_rule_before(:save) { puts "YET BEFORE SAVE" }&lt;br /&gt;Model.__create_rule_after(:save)  { puts "AFTER SAVE" }&lt;br /&gt;r3 = Model.__create_rule_after(:save)  { puts "YET AFTER SAVE" }&lt;br /&gt;obj.save&lt;br /&gt;Object.__remove_rule(r2)&lt;br /&gt;puts "----------"&lt;br /&gt;obj.save&lt;br /&gt;Object.__remove_rule(r3)&lt;br /&gt;puts "----------"&lt;br /&gt;obj.save&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;produces:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;RELOAD:FRESH&lt;br /&gt;RELOAD:STALE&lt;br /&gt;RELOAD:reloaded&lt;br /&gt;YET BEFORE SAVE&lt;br /&gt;BEFORE SAVE&lt;br /&gt;save&lt;br /&gt;AFTER SAVE&lt;br /&gt;YET AFTER SAVE&lt;br /&gt;----------&lt;br /&gt;BEFORE SAVE&lt;br /&gt;save&lt;br /&gt;AFTER SAVE&lt;br /&gt;YET AFTER SAVE&lt;br /&gt;----------&lt;br /&gt;BEFORE SAVE&lt;br /&gt;save&lt;br /&gt;AFTER SAVE&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 03 Mar 2007 10:50:20 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3620</guid>
      <author>dseverin ()</author>
    </item>
    <item>
      <title>PrettyConditions</title>
      <link>http://snippets.dzone.com/posts/show/2777</link>
      <description>// PrettyConditions allows you to easily print a report based on a condition for an ActiveRecord subclass&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class ActiveRecord::Base&lt;br /&gt;  def self.pretty_conditions(hash)&lt;br /&gt;    meta_def hash[:name] do&lt;br /&gt;      array = []&lt;br /&gt;      puts "#{hash[:message]}:"&lt;br /&gt;      puts "------------------"&lt;br /&gt;      self.find(:all, :conditions =&gt; hash[:conditions]).each do |record|&lt;br /&gt;        module_eval %[puts record.#{hash[:column_name]}]&lt;br /&gt;        array &lt;&lt; record&lt;br /&gt;      end&lt;br /&gt;      puts "------------------"&lt;br /&gt;      puts "Total: #{array.size}"&lt;br /&gt;      puts "------------------"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Youth &lt; ActiveRecord::Base&lt;br /&gt;  pretty_conditions :name =&gt; 'unsponsored', :column_name =&gt; 'name', :message =&gt; "Unsponsored Youth", :conditions =&gt; "sponsor LIKE '%XXX%'"&lt;br /&gt;  pretty_conditions :name =&gt; 'touchgroup_leaders', :column_name =&gt; 'name', :message =&gt; "Touchgroup Leaders", :conditions =&gt; ["touchgroup =?",'t']&lt;br /&gt;  pretty_conditions :name =&gt; 'vegitarians', :column_name =&gt; 'name', :message =&gt; "Vegitarians", :conditions =&gt; ["vegitarian =?",'t'] &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Youth.unsponsored&lt;br /&gt;Youth.touchgroup_leaders&lt;br /&gt;Youth.vegitarians&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Output:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;saurasaurusrex:~/software cdcarter$ ruby actions.rb&lt;br /&gt;Unsponsored Youth:&lt;br /&gt;------------------&lt;br /&gt;Hannah Gilbert&lt;br /&gt;Jesse Lavercombe&lt;br /&gt;Zach Adams&lt;br /&gt;Danika Zabertini&lt;br /&gt;------------------&lt;br /&gt;Total: 4&lt;br /&gt;------------------&lt;br /&gt;&lt;br /&gt;Touchgroup Leaders:&lt;br /&gt;------------------&lt;br /&gt;Leland McKeeman&lt;br /&gt;Marlee Leebrick-Stryker&lt;br /&gt;Meggie Huges-Morrison&lt;br /&gt;------------------&lt;br /&gt;Total: 3&lt;br /&gt;------------------&lt;br /&gt;&lt;br /&gt;Vegitarians:&lt;br /&gt;------------------&lt;br /&gt;Marlee Leebrick-Stryker&lt;br /&gt;Meggie Huges-Morrison&lt;br /&gt;Amelia Nybakke&lt;br /&gt;Ethan Edl&lt;br /&gt;Maggie Heath&lt;br /&gt;------------------&lt;br /&gt;Total: 5&lt;br /&gt;------------------&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 04 Oct 2006 09:23:32 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2777</guid>
      <author>cdcarter ()</author>
    </item>
    <item>
      <title>Overload for Ruby</title>
      <link>http://snippets.dzone.com/posts/show/2642</link>
      <description>An module let you overload functions&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# Example:&lt;br /&gt;#&lt;br /&gt;# class Test1&lt;br /&gt;#   include Overload&lt;br /&gt;# &lt;br /&gt;#   def foo&lt;br /&gt;#     puts "foo # Original one"&lt;br /&gt;#   end&lt;br /&gt;# &lt;br /&gt;#   overload :foo, :foo_str, String do |str, x|&lt;br /&gt;#     puts "foo_str(String str, x)"&lt;br /&gt;#   end&lt;br /&gt;# &lt;br /&gt;#   overload :foo, Integer do |i|&lt;br /&gt;#     puts "foo(Integer i) # no specific name"&lt;br /&gt;#   end&lt;br /&gt;# end&lt;br /&gt;module Overload&lt;br /&gt;&lt;br /&gt;  def self.included(klass)&lt;br /&gt;    class &lt;&lt; klass&lt;br /&gt;      include Overload::Feature&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.spec_to_cond(spec)&lt;br /&gt;    code = "args.length == #{spec[0]}"&lt;br /&gt;    spec[1..-1].each_with_index { |s, i|&lt;br /&gt;      code &lt;&lt; " &amp;&amp; #{s.inspect} === args[#{i}]"&lt;br /&gt;    }&lt;br /&gt;    code&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  module Feature&lt;br /&gt;&lt;br /&gt;    private&lt;br /&gt;&lt;br /&gt;    def overload(method_id, *spec, &amp;block)&lt;br /&gt;      if spec[0].instance_of? Symbol&lt;br /&gt;        specific_method_id = spec.shift&lt;br /&gt;        define_method(specific_method_id, block) if block&lt;br /&gt;        block = instance_method(specific_method_id)&lt;br /&gt;      elsif block&lt;br /&gt;        define_method(method_id, block)&lt;br /&gt;        block = instance_method(method_id)&lt;br /&gt;        remove_method(method_id)&lt;br /&gt;      else&lt;br /&gt;        raise "You must give a block or a name of existing method!"&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      spec.unshift(block.arity)&lt;br /&gt;      add_method_to_dispatch_table(method_id, spec, block)&lt;br /&gt;&lt;br /&gt;      update_dispatcher(method_id)&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def add_method_to_dispatch_table(method_id, key, block)&lt;br /&gt;      if !dispatch_table[method_id]&lt;br /&gt;        dispatch_table[method_id] = Hash.new&lt;br /&gt;      end&lt;br /&gt;      dispatch_table[method_id][key] = block&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def update_dispatcher(method_id)&lt;br /&gt;      remove_method(method_id) if method_defined?(method_id)&lt;br /&gt;      class_eval dispatcher_code(method_id), "#{method_id}_dispatcher", 0&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def dispatcher_code(method_id)&lt;br /&gt;      method_body = &lt;&lt;-EOS&lt;br /&gt;        def #{method_id.to_s}(*args, &amp;blk)&lt;br /&gt;          dt = DispatchTable[#{method_id.inspect}]&lt;br /&gt;      EOS&lt;br /&gt;&lt;br /&gt;      sorted_dispatch_table_of(method_id).each_with_index do |(spec, block), i|&lt;br /&gt;        method_body &lt;&lt; &lt;&lt;-EOS&lt;br /&gt;          #{(i==0) ? "if" : "elsif"} #{Overload::spec_to_cond(spec)}&lt;br /&gt;            dt[#{spec.inspect}].bind(self).call(*args, &amp;blk)&lt;br /&gt;        EOS&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      method_body &lt;&lt; &lt;&lt;-EOS&lt;br /&gt;          else&lt;br /&gt;            raise "Couldn't find method for #{method_id}(\#{args.inspect[1..-2]})"&lt;br /&gt;          end&lt;br /&gt;        end&lt;br /&gt;      EOS&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def sorted_dispatch_table_of(method_id)&lt;br /&gt;      dispatch_table[method_id].sort do |a,b|&lt;br /&gt;        a[0].length &lt;=&gt; b[0].length&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def dispatch_table&lt;br /&gt;      const_set("DispatchTable", Hash.new) if !const_defined?("DispatchTable")&lt;br /&gt;      const_get("DispatchTable")&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 22 Sep 2006 13:49:58 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2642</guid>
      <author>WanCW (WanCW)</author>
    </item>
    <item>
      <title>Get the name of the current method in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/2366</link>
      <description>Found at &lt;a href="http://nubyonrails.com/articles/2006/08/04/seattle-rbbq"&gt;http://nubyonrails.com/articles/2006/08/04/seattle-rbbq&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def method_name&lt;br /&gt;  if  /`(.*)'/.match(caller.first)&lt;br /&gt;    return $1&lt;br /&gt;  end&lt;br /&gt;  nil&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def blah&lt;br /&gt;  puts method_name&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;blah  # =&gt; 'blah'&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 04 Aug 2006 19:22:00 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2366</guid>
      <author>jswizard (JavaScript Wizard)</author>
    </item>
    <item>
      <title>metaprogramming new classes in ruby</title>
      <link>http://snippets.dzone.com/posts/show/637</link>
      <description>Take a class name in a string ('Test' or 'My::Module::Test') and create a new class for it.&lt;br /&gt;&lt;br /&gt;old method.  didn't like evaling the string though...&lt;br /&gt;&lt;code&gt;agent_name = "#{model_name.to_s.camelize}Agent"&lt;br /&gt;agent_class = instance_eval %{Object::#{agent_name} = Class.new(Administration::Agent)}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;new method&lt;br /&gt;&lt;code&gt;agent_name_pieces = agent_name.split('::')&lt;br /&gt;agent_class_name = agent_name_pieces.pop&lt;br /&gt;agent_module = agent_name_pieces.inject(Object) { |obj, name| obj.const_defined?(name) ? obj.const_get(name) : obj.const_set(name, Module.new)  }&lt;br /&gt;agent_class = agent_module.const_set(agent_class_name, Class.new(Administration::Agent))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For acedemic purposes mainly, I don't know if the new method is any faster.  I just wanted a version with as little string evaluation as possible.  See my &lt;a href="http://techno-weenie.net/blog/main/254/more-on-avoiding-ruby-keywords"&gt;blog entry&lt;/a&gt; on this very topic.</description>
      <pubDate>Tue, 06 Sep 2005 11:12:38 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/637</guid>
      <author>technoweenie (Rick Olson)</author>
    </item>
  </channel>
</rss>
