Sha256: 598a86bbdc1cbee323e9b6d75aba9f6fa0ef656e86188fdd7266e4f7c55cd60f

Contents?: true

Size: 1.38 KB

Versions: 11

Compression:

Stored size: 1.38 KB

Contents

module DataMapper; module Ext
  module Module

    # @api semipublic
    def self.find_const(mod, const_name)
      if const_name[0..1] == '::'
        DataMapper::Ext::Object.full_const_get(const_name[2..-1])
      else
        nested_const_lookup(mod, const_name)
      end
    end

  private

    # Doesn't do any caching since constants can change with remove_const
    def self.nested_const_lookup(mod, const_name)
      unless mod.equal?(::Object)
        constants = []

        mod.name.split('::').each do |part|
          const = constants.last || ::Object
          constants << const.const_get(part)
        end

        parts = const_name.split('::')

        # from most to least specific constant, use each as a base and try
        # to find a constant with the name const_name within them
        constants.reverse_each do |const|
          # return the nested constant if available
          return const if parts.all? do |part|
            const = if RUBY_VERSION >= '1.9.0'
              const.const_defined?(part, false) ? const.const_get(part, false) : nil
            else
              const.const_defined?(part) ? const.const_get(part) : nil
            end
          end
        end
      end

      # no relative constant found, fallback to an absolute lookup and
      # use const_missing if not found
      DataMapper::Ext::Object.full_const_get(const_name)
    end

  end
end; end

Version data entries

11 entries across 11 versions & 4 rubygems

Version Path
sbf-dm-core-1.4.0 lib/dm-core/support/ext/module.rb
sbf-dm-core-1.3.0 lib/dm-core/support/ext/module.rb
sbf-dm-core-1.3.0.beta lib/dm-core/support/ext/module.rb
ardm-core-1.3.0 lib/dm-core/support/ext/module.rb
ardm-core-1.2.1 lib/dm-core/support/ext/module.rb
dm-core-1.2.1 lib/dm-core/support/ext/module.rb
ghost_dm-core-1.3.0.beta lib/dm-core/support/ext/module.rb
dm-core-1.2.0 lib/dm-core/support/ext/module.rb
dm-core-1.2.0.rc2 lib/dm-core/support/ext/module.rb
dm-core-1.2.0.rc1 lib/dm-core/support/ext/module.rb
dm-core-1.1.0 lib/dm-core/support/ext/module.rb