Sha256: a2b0287d189c143f5dcd2f434b83a2d096185d53dbf13950b7a98c5d84de57df

Contents?: true

Size: 1.29 KB

Versions: 2

Compression:

Stored size: 1.29 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)
        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

    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

2 entries across 2 versions & 1 rubygems

Version Path
dissociated_introspection-0.1.1 lib/dissociated_introspection/recording_parent.rb
dissociated_introspection-0.1.0 lib/dissociated_introspection/recording_parent.rb