module Vedeu

  module API

    # The internal API methods allow Vedeu to function and change
    # without major refactoring. The methods listed here will rarely
    # be used by client applications.
    #
    module Internal

      extend Forwardable

      module_function

      # Manipulate the repository of background colours.
      #
      # @example
      #   Vedeu.background_colours
      #
      # @!method background_colours
      # @return [Vedeu::Colours::Backgrounds]
      def_delegators Vedeu::Colours::Backgrounds, :background_colours

      # Manipulate the repository of borders.
      #
      # @example
      #   Vedeu.borders
      #
      # @!method borders
      # @return [Vedeu::Borders::Repository]
      def_delegators Vedeu::Borders::Repository, :borders

      # Manipulate the repository of buffers.
      #
      # @example
      #   Vedeu.buffers
      #
      # @!method buffers
      # @return [Vedeu::Buffers::Repository]
      def_delegators Vedeu::Buffers::Repository, :buffers

      # Manipulate the repository of cursors.
      #
      # @example
      #   Vedeu.cursors
      #
      # @!method cursors
      # @return [Vedeu::Cursors::Repository]
      def_delegators Vedeu::Cursors::Repository, :cursors

      # Allow debugging via the creation of stack traces courtesy of
      # ruby-prof.
      #
      # @example
      #   Vedeu.debug
      #
      # @!method debug
      # @return [Vedeu::Logging::Debug]
      def_delegators Vedeu::Logging::Debug, :debug

      # Manipulate the repository of documents.
      #
      # @example
      #   Vedeu.documents
      #
      # @!method documents
      # @return [Vedeu::Editor::Documents]
      def_delegators Vedeu::Editor::Documents, :documents

      # Manipulate the repository of events.
      #
      # @example
      #   Vedeu.events
      #
      # @!method events
      # @return [Vedeu::Events::Repository]
      def_delegators Vedeu::Events::Repository, :events

      # Manipulate the repository of foreground colours.
      #
      # @example
      #   Vedeu.foreground_colours
      #
      # @!method foreground_colours
      # @return [Vedeu::Colours::Foregrounds]
      def_delegators Vedeu::Colours::Foregrounds, :foreground_colours

      # Manipulate the repository of geometries.
      #
      # @example
      #   Vedeu.geometries
      #
      # @!method geometries
      # @return [Vedeu::Geometry::Repository]
      def_delegators Vedeu::Geometry::Repository, :geometries

      # Manipulate the repository of groups.
      #
      # @example
      #   Vedeu.groups
      #
      # @!method groups
      # @return [Vedeu::Models::Groups]
      def_delegators Vedeu::Models::Groups, :groups

      # Manipulate the repository of interfaces.
      #
      # @example
      #   Vedeu.interfaces
      #
      # @!method interfaces
      # @return [Vedeu::Models::Interfaces]
      def_delegators Vedeu::Models::Interfaces, :interfaces

      # Manipulate the repository of keymaps.
      #
      # @example
      #   Vedeu.keymaps
      #
      # @!method keymaps
      # @return [Vedeu::Input::Keymaps]
      def_delegators Vedeu::Input::Keymaps, :keymaps

      # Manipulate the repository of menus.
      #
      # @example
      #   Vedeu.menus
      #
      # @!method menus
      # @return [Vedeu::Menus::Repository]
      def_delegators Vedeu::Menus::Repository, :menus

      # Manipulate the internal flags.
      #
      # @!method ready?
      # @!method ready!
      # @return [Boolean]
      def_delegators Vedeu::Runtime::Flags, :ready?, :ready!

      # @example
      #   Vedeu.renderer
      #   Vedeu.renderers
      #
      # @!method renderer
      #   @see Vedeu::Renderers#renderer
      # @!method renderers
      #   @see Vedeu::Renderers#renderers
      def_delegators Vedeu::Renderers, :renderer, :renderers

      # Instruct the terminal to resize. This will happen
      # automatically as the terminal recieves SIGWINCH signals.
      #
      # @example
      #   Vedeu.resize
      #
      # @!method resize
      #   @see Vedeu::Terminal#resize
      def_delegators Vedeu::Terminal, :resize

      # Measure the execution time of the code in the given block.
      #
      # @example
      #   Vedeu.timer do
      #     # ... some code here ...
      #   end
      #
      # @!method timer
      #   @see Vedeu::Logging::Timer.timer
      def_delegators Vedeu::Logging::Timer, :timer

    end # Internal

  end # API

  extend Vedeu::API::Internal

end # Vedeu