Module: Steroids::Extensions::MethodExtension

Included in:
ProcExtension
Defined in:
lib/steroids/extensions/method_extension.rb

Instance Method Summary collapse

Instance Method Details

#apply(*given_arguments, **given_options, &block) ⇒ Object

TODO: Use *arguments.extract_options instead!



9
10
11
12
13
# File 'lib/steroids/extensions/method_extension.rb', line 9

def apply(*given_arguments, **given_options, &block)
  applied_arguments = dynamic_arguments_for(given_arguments, given_options)
  applied_options = dynamic_options_for(given_options)
  self.yield(*applied_arguments, **applied_options, &block)
end

#argumentsObject


Parameters




44
45
46
# File 'lib/steroids/extensions/method_extension.rb', line 44

def arguments
  self.parameters.select { |key,v| key == :req || key == :opt }.map { |argument| argument.second }
end

#dynamic_arguments_for(given_arguments, given_options) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/steroids/extensions/method_extension.rb', line 15

def dynamic_arguments_for(given_arguments, given_options)
  return given_arguments if self.rest?

  expected_arguments_count = self.least_arguments.count
  non_nil_given_arguments_count = given_arguments.take_while(&:present?).count
  applied_arguments = given_arguments.first([expected_arguments_count, non_nil_given_arguments_count].max)
  return applied_arguments if self.spread? && self.options.any?

  applied_arguments << given_options if applied_arguments.count < self.arguments.count && given_options.any?
  applied_arguments
end

#dynamic_options_for(given_options) ⇒ Object



27
28
29
30
31
# File 'lib/steroids/extensions/method_extension.rb', line 27

def dynamic_options_for(given_options)
  return given_options if self.spread?

  given_options.select { |key| self.options.include?(key) }
end

#optionsObject



48
49
50
# File 'lib/steroids/extensions/method_extension.rb', line 48

def options
  self.parameters.select { |key,v| key == :key || key == :keyreq }.map { |option| option.second }
end

#rest?Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/steroids/extensions/method_extension.rb', line 56

def rest?
  !!self.parameters.find { |parameter| parameter.first == :rest }
end

#spread?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/steroids/extensions/method_extension.rb', line 52

def spread?
  !!self.parameters.find { |parameter| parameter.first == :keyrest }
end