Trying to determine all dependencies for #render
module ActionView
module Helpers
module RenderingHelper
def render(options = {}, locals = {}, &block)
# ...
view_renderer.render_partial
end
end
end
end
module ActionView
module Rendering
# ...
def view_renderer
ActionView::Renderer.new(lookup_context)
end
end
end
ActionController::Base
includes AbstractController::Rendering
implements #render
calls #render_to_body
includes ActionView::Layouts
includes ActionView::Rendering
implements #render_to_body
calls #view_renderer
implements #view_renderer
calls #lookup_context
includes ActionView::ViewPaths
implements #lookup_context
ResultsController.ancestors
=> [ApplicationController,
# ... ~ 60 ancestors
ActionController::Metal,
AbstractController::Base,
ActiveSupport::Configurable,
Object,
PP::ObjectMixin,
FriendlyId::ObjectUtils,
ActiveSupport::Dependencies::Loadable,
JSON::Ext::Generator::GeneratorMethods::Object,
Kernel,
BasicObject]
module RenderingHelper
# Implements methods that allow rendering from a view context.
# In order to use this module, all you need is to implement
# view_renderer that returns an ActionView::Renderer object.
def render(options = {}, locals = {}, &block)
view_renderer.render_parital
end
end
class Hero
end
module Wingman
end
class Guest < Module
end
class Host
include Hero # ?
include Hero.new # ?
include Wingman # ?
include Wingman.new # ?
include Guest # ?
include Guest.new # ?
end
Host#include(guest)
class Drivable < Module
def initialize(vehicle)
define_method(:drive) { vehicle }
end
def transmission
:manual
end
end
class Hero
include Drivable.new(:batmobil)
end
Hero.new.public_methods.grep(/transmission|drive/) # => ???
class Guest < Module
attr_reader :state
# 2. store private state
def initialize(state)
@state = state
create_methods
end
# 4. hook behavior into host class
def included(host)
# host.class_eval { }
# host.send(:include)
end
def create_methods
ctx = self
# 3. evaluate code in context of host class
define_method :to_s { ctx.state[:name] }
end
end
class Host
# 1. configure Guest dependencies/state
include Guest.new(name: 'me',
renderer: Renderer.new)
end