Sha256: fe48638375894820414197b04a5f4608f0f12d551d87636098b8cac2f7e1efe9
Contents?: true
Size: 1.18 KB
Versions: 3
Compression:
Stored size: 1.18 KB
Contents
# frozen_string_literal: true module JunkDrawer # error to be thrown by Callable class CallableError < StandardError end # module to constrain interfaces of classes to just `call` module Callable def call raise NotImplementedError end def to_proc proc { |args| self.(*args) } end # `ClassMethods` defines a class level method `call` that delegates to # an instance. It also causes an error to be raised if a public instance # method is defined with a name other than `call` module ClassMethods def call(*args, &block) new.(*args, &block) end def to_proc new.to_proc end def method_added(method_name) return if valid_callable_method?(method_name) raise CallableError, "invalid method name #{method_name}, " \ 'only public method allowed is "call"' end private def valid_callable_method?(method_name) method_name == :call || !public_method_defined?(method_name) || method_name.to_s.start_with?('__') end end def self.included(base) base.public_send(:extend, ClassMethods) end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
junk_drawer-1.6.1 | lib/junk_drawer/callable.rb |
junk_drawer-1.6.0 | lib/junk_drawer/callable.rb |
junk_drawer-1.5.0 | lib/junk_drawer/callable.rb |