Automatic construction of interdependent objects using Ruby reflection and meta-programming.


TODO

  • Interdependent classes in different modules.

Quick start

> gem install boil

An example: 

ReviewSubmissionPresenter
  ReviewSubmissionView
  ReviewSubmissionModel
    ReviewStore
    ReviewValidationPolicy
    ReviewResubmissionPolicy

(TODO: insert image of dependency diagram)

With classes in the global namespace or in the same module, it uses reasonable defaults:

  class ReviewSubmissionPresenter
    def initialize(review_submission_view, review_submission_model)
    # ...
    end
  end

  class ReviewSubmissionModel
    def initialize(review_workflow_policy)
    # ...
    end
  end

  def ReviewSubmissionView
    # ...
  end

  class ReviewWorkflowPolicy
    def initialize(review_store, review_validation_policy, review_resubmission_policy)
    # ...
    end
  end

TBD With different module, you need to explicitly compose:

  module Presenters
    class ReviewSubmissionPresenter
      include Boil::Composer
      compose view: Views::ReviewSubmissionView
      compose model: Models::ReviewSubmissionModel

      def initialize(view, model)
      # ...
      end
    end

  module Models

    class ReviewSubmissionModel
      include Boil::Composer
      compose review_workflow_policy: Policies::ReviewWorkflowPolicy

      def initialize(review_workflow_policy)
      # ...
      end
    end
  end

  module Views
    def ReviewSubmissionView
      # ...
    end
  end


  module Policies
    class ReviewWorkflowPolicy
      include Boil::Composer

      compose 
        review_store: Stores::ReviewStore,
        review_validation_policy: Policies::ReviewValidationPolicy,
        review_resubmission_policy: Policies::ReviewResubmissionPolicy


      def initialize(review_store, review_validation_policy, review_resubmission_policy)
      # ...
      end
    end

    class ReviewValidationPolicy
    end

    class ReviewResubmissionPolicy
      include Boil::Composer
      compose review_store: DataStores::ReviewStore

      def initialize(review_store)
      end
    end
  end

  module DataStores
    class ReviewStore
    end
  end