;; -*- lexical-binding: t; -*- ;;; The Object Prototype ( defun publication-object ( ) ( let ( ( object-projects ( list ) ) ( org-publish-project-alist ( list ) ) ( success-report "Build complete!" ) ) ( list :object-compose ( lambda ( ) ( setq org-publish-project-alist ( list object-projects ) ) ( ) ) :object-get-projects ( lambda ( data-projects ) ( setq object-projects ( append data-projects object-projects ) ) ( ) ) :object-report ( lambda ( ) ( print org-publish-project-alist ) ( print success-report ) ( ) ) ) ) ) ;;; The Object Interface ( defun object-compose ( publication-instance ) ( funcall ( plist-get publication-instance :object-compose ) ) ) ( defun object-get-projects ( publication-instance data-projects ) ( funcall ( plist-get publication-instance :object-get-projects ) data-projects ) ) ( defun object-report ( publication-instance ) ( funcall ( plist-get publication-instance :object-report ) ) ) ;;; The User Logic ( defun export-project-alist ( publication-instance ) ( object-compose publication-instance ) ( object-report publication-instance ) ) ( defun import-data ( publication-instance project-data ) ( let ( ( data-projects ( plist-get project-data :data-projects ) ) ) ( object-get-projects publication-instance data-projects ) ) ) ;;; The User Interface ( defun publish ( publication-instance &rest project-data ) ( import-data publication-instance project-data ) ( export-project-alist publication-instance ) ( ) )