class Pakyow::Presenter::Framework

Public Instance Methods

boot() click to toggle source
# File lib/pakyow/presenter/framework.rb, line 39
def boot
  object.class_eval do
    isolate Binder
    isolate Presenter

    # Make sure component presenters inherit from this app's presenter.
    #
    isolated_presenter = isolated(:Presenter)
    isolate Component do
      @__presenter_class = isolated_presenter
    end

    isolate Renderer do
      include Renderer::Behavior::CleanupPrototypeNodes
      include Renderer::Behavior::CleanupUnboundBindings
      include Renderer::Behavior::InsertPrototypeBar
      include Renderer::Behavior::InstallAuthenticity
      include Renderer::Behavior::PlaceInMode
      include Renderer::Behavior::CreateTemplateNodes
      include Renderer::Behavior::SetupEndpoints
      include Renderer::Behavior::SetupForms
      include Renderer::Behavior::SetPageTitle
    end

    after "load" do
      isolated(:Renderer) do
        include Renderer::Behavior::RenderComponents
      end
    end

    def presenter_for_context(presenter_class, context)
      presenter_class.new(
        context.view, app: context.app, presentables: context.presentables
      )
    end

    stateful :binder,    isolated(:Binder)
    stateful :component, isolated(:Component)
    stateful :presenter, isolated(:Presenter)

    stateful :processor, Processor
    stateful :templates, Templates

    aspect :binders
    aspect :components
    aspect :presenters

    register_helper :active, Application::Helpers::Presenter::Rendering

    isolated :Connection do
      include Renderable
    end

    isolated :Controller do
      include Application::Behavior::Presenter::ImplicitRendering

      action :verify_form_metadata do
        if metadata = params[:"pw-form"]
          connection.set(
            :__form,
            JSON.parse(
              connection.verifier.verify(metadata)
            ).indifferentize
          )

          params.delete(:"pw-form")
        end
      end
    end

    on "load" do
      self.class.include_helpers :global, isolated(:Binder)
      self.class.include_helpers :global, isolated(:Presenter)
      self.class.include_helpers :active, isolated(:Component)

      # Override the app helper so that config returns the component config.
      # FIXME: Find a clearer way to do this.
      #
      isolated(:Component) do
        if instance_methods(false).include?(:config)
          remove_method :config
        end

        attr_reader :config
      end
    end

    # Let each renderer action attach renders to the app's presenter.
    #
    after "initialize", priority: :low do
      [isolated(:Presenter)].concat(
        state(:presenter)
      ).concat(
        state(:component).map(&:__presenter_class)
      ).uniq.each do |presenter|
        isolated(:Renderer).attach!(presenter, app: self)
      end
    end

    # Update the presenter version and rebuild the app version.
    #
    after "initialize" do
      config.presenter.version = Support::PathVersion.build(config.presenter.path)

      app_version = Digest::SHA1.new
      app_version.update(config.version)
      app_version.update(config.presenter.version)
      config.version = app_version.to_s
    end

    include Application::Config::Presenter
    include Application::Behavior::Presenter::ErrorRendering
    include Application::Behavior::Presenter::Exposures
    include Application::Behavior::Presenter::Initializing
    include Application::Behavior::Presenter::Modes
    include Application::Behavior::Presenter::Versions
    include Application::Behavior::Presenter::Watching

    def view_info_for_path(path)
      path = String.collapse_path(path)

      state(:templates).lazy.map { |store|
        store.info(path)
      }.find(&:itself)
    end

    def view?(path)
      !view_info_for_path(path).nil?
    end
  end
end
presenter_for_context(presenter_class, context) click to toggle source
# File lib/pakyow/presenter/framework.rb, line 69
def presenter_for_context(presenter_class, context)
  presenter_class.new(
    context.view, app: context.app, presentables: context.presentables
  )
end
view?(path) click to toggle source
# File lib/pakyow/presenter/framework.rb, line 165
def view?(path)
  !view_info_for_path(path).nil?
end
view_info_for_path(path) click to toggle source
# File lib/pakyow/presenter/framework.rb, line 157
def view_info_for_path(path)
  path = String.collapse_path(path)

  state(:templates).lazy.map { |store|
    store.info(path)
  }.find(&:itself)
end