Module: Polyfill

Defined in:
lib/polyfill.rb,
lib/polyfill/v2_2.rb,
lib/polyfill/v2_3.rb,
lib/polyfill/v2_4.rb,
lib/polyfill/v2_5.rb,
lib/polyfill/v2_6.rb,
lib/polyfill/v2_4/io.rb,
lib/polyfill/version.rb,
lib/polyfill/v2_4/dir.rb,
lib/polyfill/v2_5/dir.rb,
lib/polyfill/v2_5/set.rb,
lib/polyfill/v2_2/math.rb,
lib/polyfill/v2_3/hash.rb,
lib/polyfill/v2_4/file.rb,
lib/polyfill/v2_4/hash.rb,
lib/polyfill/v2_5/hash.rb,
lib/polyfill/v2_5/time.rb,
lib/polyfill/v2_6/hash.rb,
lib/polyfill/v2_2/prime.rb,
lib/polyfill/v2_3/array.rb,
lib/polyfill/v2_3/prime.rb,
lib/polyfill/v2_4/array.rb,
lib/polyfill/v2_4/float.rb,
lib/polyfill/v2_5/array.rb,
lib/polyfill/v2_2/kernel.rb,
lib/polyfill/v2_2/vector.rb,
lib/polyfill/v2_3/kernel.rb,
lib/polyfill/v2_3/string.rb,
lib/polyfill/v2_3/struct.rb,
lib/polyfill/v2_4/object.rb,
lib/polyfill/v2_4/regexp.rb,
lib/polyfill/v2_4/string.rb,
lib/polyfill/v2_4/symbol.rb,
lib/polyfill/v2_5/kernel.rb,
lib/polyfill/v2_5/string.rb,
lib/polyfill/v2_5/struct.rb,
lib/polyfill/v2_6/kernel.rb,
lib/polyfill/v2_3/numeric.rb,
lib/polyfill/v2_4/integer.rb,
lib/polyfill/v2_4/numeric.rb,
lib/polyfill/v2_5/integer.rb,
lib/polyfill/v2_4/i_p_addr.rb,
lib/polyfill/v2_4/pathname.rb,
lib/polyfill/internal_utils.rb,
lib/polyfill/v2_4/string_io.rb,
lib/polyfill/v2_2/enumerable.rb,
lib/polyfill/v2_3/enumerable.rb,
lib/polyfill/v2_4/comparable.rb,
lib/polyfill/v2_4/enumerable.rb,
lib/polyfill/v2_4/match_data.rb,
lib/polyfill/v2_5/enumerable.rb,
lib/polyfill/v2_5/big_decimal.rb,
lib/polyfill/v2_3/enumerator/lazy.rb,
lib/polyfill/v2_4/enumerator/lazy.rb

Defined Under Namespace

Modules: InternalUtils, Module, V2_2, V2_3, V2_4, V2_5, V2_6

Constant Summary collapse

VERSION =
Gem::Version.new('1.6.0'.freeze)

Class Method Summary collapse

Class Method Details

.get(module_name, methods, options = {}) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/polyfill.rb', line 7

def get(module_name, methods, options = {})
  if Object.const_get(module_name.to_s, false).is_a?(Class)
    raise ArgumentError, "#{module_name} is a class not a module"
  end

  #
  # parse options
  #
  versions = InternalUtils.polyfill_versions_to_use(options.delete(:version))

  unless options.empty?
    raise ArgumentError, "unknown keyword: #{options.first[0]}"
  end

  #
  # find all polyfills for the module across all versions
  #
  modules_with_updates, modules = InternalUtils.modules_to_use(module_name, versions)

  #
  # remove methods that were not requested
  #
  requested_methods = InternalUtils.methods_to_keep(modules_with_updates, methods, '#', module_name)

  modules.each do |instance_module|
    InternalUtils.keep_only_these_methods!(instance_module, requested_methods)
  end

  #
  # build the module to return
  #
  InternalUtils.create_module do |mod|
    # make sure the methods get added if this module is included
    mod.singleton_class.send(:define_method, :included) do |base|
      modules.each do |module_to_add|
        base.include module_to_add unless module_to_add.instance_methods.empty?
      end
    end

    # make sure the methods get added if this module is extended
    mod.singleton_class.send(:define_method, :extended) do |base|
      modules.each do |module_to_add|
        base.extend module_to_add unless module_to_add.instance_methods.empty?
      end
    end

    # make sure the methods get added if this module is prepended
    mod.singleton_class.send(:define_method, :prepended) do |base|
      modules.each do |module_to_add|
        base.prepend module_to_add unless module_to_add.instance_methods.empty?
      end
    end
  end
end