Sha256: 631f82eea776892f74fd7b5599390ceada697f0a503eecc3c01212cf9d966b53

Contents?: true

Size: 1.47 KB

Versions: 8

Compression:

Stored size: 1.47 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 :attr_reader, :attr_writer, :attr_accessor, :prepend, :include, :extend
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
dissociated_introspection-0.4.1 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.4.0 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.3.1 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.2.0 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.1.6 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.1.5 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.1.4 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.1.3 lib/dissociated_introspection/recording_parent.rb