lib/tins/implement.rb
module Tins module Implement MESSAGES = { default: 'method %{method_name} not implemented in module %{module}', subclass: 'method %{method_name} has to be implemented in '\ 'subclasses of %{module}', submodule: 'method %{method_name} has to be implemented in '\ 'submodules of %{module}', } def implement(method_name, msg = :default) method_name.nil? and return case msg when ::Symbol msg = MESSAGES.fetch(msg) when ::Hash return implement method_name, msg.fetch(:in) end display_method_name = method_name if m = instance_method(method_name) rescue nil m.extend Tins::MethodDescription display_method_name = m.description(style: :name) end begin msg = msg % { method_name: display_method_name, module: self } rescue KeyError end define_method(method_name) do |*| raise ::NotImplementedError, msg end end def implement_in_submodule(method_name) implement method_name, 'method %{method_name} has to be implemented in submodules of'\ ' %{module}' end end end