Just a thought. In our library we have a command which we would like to extend in the application. Normally I would use a pub/sub model where the command would emit an event.

But maybe we could use callbacks.

class CreateStudy
  extend ActiveModel::Callbacks
  define_model_callbacks :create

  def call(form)
    if form.valid?
      @study = Study.new(form.study_attributes)
      
      run_callbacks :create do
        @study.save!
      end
    end
  end
end

Using the callback we can add additional behaviour in our application

class CreateStudy
  after_create :add_site
  
  private
  
  def add_site
    # ...    
  end
end