Sha256: e87a4b353f03c8f2e51d12adb721741f63a717b2ebcf7387f9a9b46d99ff5c6b

Contents?: true

Size: 1.46 KB

Versions: 3

Compression:

Stored size: 1.46 KB

Contents

class RecordingParent < BasicObject
  class << self
    def method_missing(m, *args, &block)
      __missing_class_macros__.push({ m => [args, block].compact })
    end

    def __missing_class_macros__
      @__missing_class_macros__ ||= []
    end

    module ConstMissing
      def const_missing(const_sym)
        if const_defined?("::#{const_sym}")
          Kernel.const_get("::#{const_sym}")
        else
          const = self.const_set(const_sym, Module.new)
          const.extend ConstMissing
          const.module_eval(<<-RUBY, __FILE__, __LINE__+1)
                    def self.name
                      "#{name.gsub(/#<Module:.*>::/, '')}::#{const_sym}"
                    end

                    def self.inspect
                      name
                    end
          RUBY
          RecordingParent.__missing_constants__[const_sym] = const
          const
        end
      end
    end

    include ConstMissing

    def __missing_constants__
      # This file and it's class variables are reinitialized within a new module namespace on every run.
      @@__missing_constants__ ||= {}
    end

    def listen_to_defined_macros(*methods)
      methods.each do |m|
        module_eval(<<-RUBY, __FILE__)
          def self.#{m}(*args, &block)
            __missing_class_macros__.push({ __method__ => [args, block].compact })
          end
        RUBY
      end
    end
  end

  listen_to_defined_macros *DissociatedIntrospection.listen_to_defined_class_methods
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dissociated_introspection-0.13.0 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.12.0 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.11.0 lib/dissociated_introspection/recording_parent.rb