Class Benelux::MethodPacker

  1. lib/benelux/packer.rb
Parent: Object

Classes and Modules

Module Benelux::MethodPacker::InstanceExecHelper

Attributes

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

Public class methods

class_method_defined? (klass, meth)
[show source]
    # File lib/benelux/packer.rb, line 74
74:     def self.class_method_defined?(klass, meth)
75:       meth &&= meth.to_s if RUBY_VERSION < "1.9"
76:       klass.singleton_methods.member? meth
77:     end
method_defined? (klass, meth)
[show source]
    # File lib/benelux/packer.rb, line 68
68:     def self.method_defined?(klass, meth)
69:       meth &&= meth.to_s if RUBY_VERSION < "1.9"
70:       klass.method_defined?(meth) || 
71:       klass.private_method_defined?(meth) ||
72:       klass.protected_method_defined?(meth)
73:     end
new (k,m,aliaz,&blk)
  • 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.
[show source]
    # File lib/benelux/packer.rb, line 24
24:     def initialize(k,m,aliaz,&blk)
25:       Benelux.ld "%20s: %s#%s" % [self.class, k, m]
26:       if Benelux.packed_method? k, m
27:         raise SelectableError, "Already defined (#{k} #{m})"
28:       end
29:       @klass, @meth, @aliaz, @blk = k, m, aliaz, blk
30:       @aliaz ||= meth
31:       @klass.extend Attic  unless @klass.kind_of?(Attic)
32:       unless @klass.kind_of?(Benelux)
33:         @klass.attic :timeline
34:         @klass.send :include, Benelux
35:       end
36:       ## NOTE: This is commented out so we can include  
37:       ## Benelux definitions before all classes are loaded. 
38:       ##unless obj.respond_to? meth
39:       ##  raise NoMethodError, "undefined method `#{meth}' for #{obj}:Class"
40:       ##end
41:       thread_id, call_id = Thread.current.object_id.abs, @klass.object_id.abs
42:       @methorig = methorig = :"__benelux_#{@meth}_#{thread_id}_#{call_id}"
43:       Benelux.ld "%20s: %s" % ['Alias', @methorig] 
44:       
45:       @klass.module_eval do
46:         Benelux.ld [:def, self, m, 
47:           MethodPacker.method_defined?(self, m),
48:           MethodPacker.class_method_defined?(self, m)].inspect
49:         if MethodPacker.method_defined?(self, m)
50:           alias_method methorig, m  # Can't use the instance variables
51:         elsif MethodPacker.class_method_defined?(self, m)
52:           eval "class << self; alias #{methorig} #{m}; end"
53:         else
54:           raise BeneluxError, "No such method: #{self}.#{m}"
55:         end
56:       end
57:       install_method  # see generate_packed_method
58:       self.add_tags :class => @klass.to_s.to_sym, 
59:                     :meth  => @meth.to_sym,
60:                     :kind  => self.class.to_s.to_sym
61: 
62:       Benelux.packed_methods[@klass] ||= {}
63:       Benelux.packed_methods[@klass][@meth] = self
64:       Benelux.packed_methods[:all] ||= []
65:       Benelux.packed_methods[:all] << self
66:       
67:     end

Public instance methods

install_method ()
[show source]
    # File lib/benelux/packer.rb, line 78
78:     def install_method
79:       raise "You need to implement this method"
80:     end
instance_exec (*args, &block)
[show source]
    # File lib/benelux/packer.rb, line 86
86:       def instance_exec(*args, &block) # !> method redefined; discarding old instance_exec
87:         mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
88:         InstanceExecHelper.module_eval{ define_method(mname, &block) }
89:         begin
90:           ret = send(mname, *args)
91:         ensure
92:           InstanceExecHelper.module_eval{ undef_method(mname) } rescue nil
93:         end
94:         ret
95:       end
run_block (*args)
[show source]
    # File lib/benelux/packer.rb, line 97
97:     def run_block(*args)
98:       raise "must implement"
99:     end