class Benelux::MethodPacker

Attributes

aliaz[RW]
blk[R]
klass[R]
meth[R]
methorig[RW]

Public Class Methods

class_method_defined?(klass, meth) click to toggle source
# File lib/benelux/packer.rb, line 74
def self.class_method_defined?(klass, meth)
  meth &&= meth.to_s if RUBY_VERSION < "1.9"
  klass.singleton_methods.member? meth
end
method_defined?(klass, meth) click to toggle source
# File lib/benelux/packer.rb, line 68
def self.method_defined?(klass, meth)
  meth &&= meth.to_s if RUBY_VERSION < "1.9"
  klass.method_defined?(meth) || 
  klass.private_method_defined?(meth) ||
  klass.protected_method_defined?(meth)
end
new(k,m,aliaz,&blk) click to toggle source
  • k is a class

  • m is the name of an instance method in k

  • aliaz is an optional name for

This method makes the following changes to class k.

  • Add a timeline attic to and include Benelux

  • Rename the method to something like: __benelux_execute_2151884308_2165479316

  • Install a new method with the name m.

# File lib/benelux/packer.rb, line 24
def initialize(k,m,aliaz,&blk)
  Benelux.ld "%20s: %s#%s" % [self.class, k, m]
  if Benelux.packed_method? k, m
    raise SelectableError, "Already defined (#{k} #{m})"
  end
  @klass, @meth, @aliaz, @blk = k, m, aliaz, blk
  @aliaz ||= meth
  @klass.extend Attic  unless @klass.kind_of?(Attic)
  unless @klass.kind_of?(Benelux)
    @klass.attic :timeline
    @klass.send :include, Benelux
  end
  ## NOTE: This is commented out so we can include  
  ## Benelux definitions before all classes are loaded. 
  ##unless obj.respond_to? meth
  ##  raise NoMethodError, "undefined method `#{meth}' for #{obj}:Class"
  ##end
  thread_id, call_id = Thread.current.object_id.abs, @klass.object_id.abs
  @methorig = methorig = :"__benelux_#{@meth}_#{thread_id}_#{call_id}"
  Benelux.ld "%20s: %s" % ['Alias', @methorig] 
  
  @klass.module_eval do
    Benelux.ld [:def, self, m, 
      MethodPacker.method_defined?(self, m),
      MethodPacker.class_method_defined?(self, m)].inspect
    if MethodPacker.method_defined?(self, m)
      alias_method methorig, m  # Can't use the instance variables
    elsif MethodPacker.class_method_defined?(self, m)
      eval "class << self; alias #{methorig} #{m}; end"
    else
      raise BeneluxError, "No such method: #{self}.#{m}"
    end
  end
  install_method  # see generate_packed_method
  self.add_tags :class => @klass.to_s.to_sym, 
                :meth  => @meth.to_sym,
                :kind  => self.class.to_s.to_sym

  Benelux.packed_methods[@klass] ||= {}
  Benelux.packed_methods[@klass][@meth] = self
  Benelux.packed_methods[:all] ||= []
  Benelux.packed_methods[:all] << self
  
end

Public Instance Methods

install_method() click to toggle source
# File lib/benelux/packer.rb, line 78
def install_method
  raise "You need to implement this method"
end
instance_exec(*args, &block) click to toggle source
# File lib/benelux/packer.rb, line 86
def instance_exec(*args, &block) # !> method redefined; discarding old instance_exec
  mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
  InstanceExecHelper.module_eval{ define_method(mname, &block) }
  begin
    ret = send(mname, *args)
  ensure
    InstanceExecHelper.module_eval{ undef_method(mname) } rescue nil
  end
  ret
end
run_block(*args) click to toggle source
# File lib/benelux/packer.rb, line 97
def run_block(*args)
  raise "must implement"
end