class FP::Fn
Public Class Methods
arguments(*args)
click to toggle source
# File lib/fp/fn.rb, line 16 def self.arguments(*args) maybe_spec = args.last if maybe_spec.is_a?(Hash) @arguments = args[0..-2] @spec = args.last else @arguments = args @spec = nil end by_name = @spec && @spec[:by] == :name by_position = @spec && [:pos, :position].include?(@spec[:by]) no_spec = !@spec attr_readers = @arguments.map { |arg| ":#{arg}"}.join ", " eval "attr_reader #{attr_readers}" attr_assignments = @arguments.map { |arg| "@#{arg} = #{arg}" }.join("\n") if by_position || no_spec arguments_string = @arguments.join(", ") eval <<-EOS def initialize(#{arguments_string}) #{attr_assignments} end EOS elsif by_name arguments_string = @arguments.map{ |arg| "#{arg}:"}.join(", ") eval <<-EOS def initialize(#{arguments_string}) #{attr_assignments} end EOS else raise "Unknown value (#{@spec && @spec[:by]}) for arguments spec :by parameter; valid options are :name and :position" end end
method_added(method_name, &block)
click to toggle source
# File lib/fp/fn.rb, line 3 def self.method_added(method_name, &block) is_attr_reader = (@arguments || []).include?(method_name) is_public_method = public_instance_methods.include?(method_name) if !is_attr_reader && is_public_method eval <<-EOS def self.#{method_name}(*args, &block) new(*args, &block).#{method_name} end EOS end end