Sha256: 56001c103320dd2961868c09f24b0b1f5fa62b1cf33e147f3f85e699615ef4ad

Contents?: true

Size: 1017 Bytes

Versions: 1

Compression:

Stored size: 1017 Bytes

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)
        new.(*args)
      end

      def to_proc
        new.to_proc
      end

      def method_added(method_name)
        return if method_name == :call || !public_method_defined?(method_name)

        raise CallableError, "invalid method name #{method_name}, " \
                            'only public method allowed is "call"'
      end
    end

    def self.included(base)
      base.public_send(:extend, ClassMethods)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
junk_drawer-1.1.0 lib/junk_drawer/callable.rb