lib/gamefic/scripting.rb



# frozen_string_literal: true


module Gamefic
  # An instance module that enables scripting.

  #

  # Including `Gamefic::Scripting` also extends `Gamefic::Scriptable`.

  #

  module Scripting
    require 'gamefic/scripting/proxies'
    require 'gamefic/scripting/entities'
    require 'gamefic/scripting/hooks'
    require 'gamefic/scripting/responses'
    require 'gamefic/scripting/syntaxes'
    require 'gamefic/scripting/seeds'
    require 'gamefic/scripting/scenes'

    extend Scriptable
    include Scriptable::Queries
    include Entities
    include Hooks
    include Responses
    include Seeds
    include Scenes
    include Syntaxes

    # @return [Array<Module<Scriptable>>]

    def included_scripts
      self.class.included_scripts
    end

    # @param symbol [Symbol]

    # @return [Array<Binding>]

    def find_and_bind(symbol)
      included_scripts.flat_map { |script| script.send(symbol) }
                      .map { |blk| Binding.new(self, blk) }
    end

    def self.included other
      super
      other.extend Scriptable
    end
  end
end