module DeepCover::Node::Mixin::HasChildHandler::ClassMethods

Public Instance Methods

has_child_handler(template) click to toggle source
# File lib/deep_cover/node/mixin/has_child_handler.rb, line 26
        def has_child_handler(template)
          child_method_name = format(template, name: 'child')
          action = template.gsub(/_%{name}/, '').gsub(/%{name}_/, '')
          const_name = "#{Tools.camelize(action)}Handler"
          class_eval <<-EVAL, __FILE__, __LINE__ + 1
            module #{const_name}                                     # module RewriteHandler
              module ClassMethods                                    #   module ClassMethods
                def has_child(#{action}: nil, **args)                #     def has_child(rewrite: nil, **args)
                  name, _types = args.first                          #       name, _types = args.first
                  define_child_handler(#{template.inspect},          #       define_child_handler('rewrite_%{child}',
                    name, #{action})                                 #         name, rewrite)
                  super(**args)                                      #       super(**args)
                end                                                  #     end
              end                                                    #   end

              def #{child_method_name}(child, name = nil)            #   def rewrite_child(child, name = nil)
                call_child_handler(#{template.inspect}, child,       #     call_child_handler('rewrite_%{child}', child,
                  name) || super                                     #       name) || super
              end                                                    #   end
            end                                                      # end
            include #{const_name}                                    # include RewriteHandler
            singleton_class.prepend #{const_name}::ClassMethods      # singleton_class.prepend RewriteHandler::ClassMethods
          EVAL
        end

Private Instance Methods

define_child_handler(template, name, action) click to toggle source
# File lib/deep_cover/node/mixin/has_child_handler.rb, line 51
def define_child_handler(template, name, action)
  method_name = format(template, name: name)
  case action
  when nil
    # Nothing to do
  when Symbol
    define_method(method_name) do |*args|
      arity = method(action).arity
      raise NotImplementedError if arity < 0
      send(action, *args[0...arity])
    end
  when Proc
    define_method(method_name, &action)
  else
    define_method(method_name) { |*| action }
  end
end