<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="165479" data-post-id="165479">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I switched the interface to the one I mentioned in the second half of <a href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/40" rel="nofollow">this post</a>. Basically, now we can do:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MySystemWeb do
  use Boundary, deps: [MySystem, Ecto.Changeset]
</code></pre>
<p>Which will restrain usage of ecto to only <code>Ecto.Changeset</code> boundary. If the external app defines its own boundaries, the specs of those boundaries will define what can be invoked. Otherwise, if the app doesn’t define any boundary (like in this case), an implicit boundary is created which will contain all modules from the given namespace (like e.g. <code>Ecto.Changeset.Foo.Bar</code>). An implicit boundary always exports all of its modules.</p>
<p>More details are available in <a href="https://github.com/sasa1977/boundary/blob/00db0dd9f6845b21c8b0569f17042317a4bf27c0/lib/boundary.ex#L182-L224" rel="noopener nofollow ugc">this part</a> of the moduledoc.</p>
<p>As I suggested in the aforementioned post, I also plan to add some support for strict mode, which will require us to explicitly allow the usage of any external boundary. I’m not completely clear on the details, but the rough idea is to allow a per-boundary setting (e.g. via <code>externals: :strict</code>), as well as global default (e.g. by providing <code>externals: :strict</code> in mix project config).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="165479" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/42">Post #41</a>
	                </div>
	            </div>
              <div id="likers-container-165479" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="165479"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #41"></div>
  </section>
</div>
    <div class="postbit" id="165568" data-post-id="165568">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>0.3.0 is now available on hex. You can find the changelog <a href="https://github.com/sasa1977/boundary/blob/0.3.0/CHANGELOG.md#030" rel="noopener nofollow ugc">here</a>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="165568" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/43">Post #42</a>
	                </div>
	            </div>
              <div id="likers-container-165568" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="165568"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #42"></div>
  </section>
</div>
    <div class="postbit" id="167310" data-post-id="167310">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Folks,</p>
<p>I’ve been busy for the past few days, and made a first draft of the nested boundaries support. You can find the relevant docs <a href="https://github.com/sasa1977/boundary/blob/f5b0f952e1c6d60d3eaecac72191dee889e71f87/lib/boundary.ex#L368-L476" rel="noopener nofollow ugc">here</a>. It’s worth noting that the impl in the related branch is not working exactly as advertised in docs, but that’s a minor detail which will be fixed <img src="https://forum.elixirforum.com/images/emoji/apple/laughing.png?v=15" title=":laughing:" class="emoji" alt=":laughing:" loading="lazy" width="20" height="20"></p>
<p>But at this point I’d like to get some feedback on this. Do you think it makes sense? Do you see some pitfalls?</p>
<p>While I’m at it, I also added another feature called mass-exporting. It’s added due to the need of the project I’m using for <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food" rel="noopener nofollow ugc">dogfooding</a> boundary. The relevant docs are <a href="https://github.com/sasa1977/boundary/blob/f5b0f952e1c6d60d3eaecac72191dee889e71f87/lib/boundary.ex#L155-L172" rel="noopener nofollow ugc">here</a>. I’m not completely convinced about the interface, and I’m interested in some feedback on this.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="167310" data-batch-url="/posts/batch_likers">
                        7
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/44">Post #43</a>
	                </div>
	            </div>
              <div id="likers-container-167310" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="167310"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #43"></div>
  </section>
</div>
    <div class="postbit" id="240427" data-post-id="240427">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stefanluptak" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/120/34398_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stefanluptak
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hey all,</p>
<p>I am trying to use this library in our project to enforce boundaries, but I am struggling a bit with this situation.</p>
<p>When using the example from the docs:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MySystem.Application do
  use Boundary, top_level?: true, deps: [MySystem, MySystemWeb]
  # ...
end
</code></pre>
<hr>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MySystem do
  use Boundary, deps: [], exports: []

  def create_user(name) do
    # creating user...
    MySystemWeb.Endpoint.broadcast!("notifications", "user_created", %{"name" =&gt; name})
  end
end
</code></pre>
<hr>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MySystemWeb do
  use Boundary, deps: [MySystem], exports: [Endpoint]
  # ...
end
</code></pre>
<p>I am (naturally) getting this warning:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">forbidden reference to MySystemWeb.Endpoint
  (references from MySystem to MySystemWeb are not allowed)
</code></pre>
<p>How should I organize my code to prevent this kind of boundaries violation? I can’t move the <code>broadcast!</code> call into the controller, because sometimes the <code>MySystem.create_user/1</code> function can be called from another place.</p>
<p>Thanks a lot for your suggestions and thanks <a class="mention" href="/u/sasajuric" rel="nofollow">@sasajuric</a> for this cool library. <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="240427" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/45">Post #44</a>
	                </div>
	            </div>
              <div id="likers-container-240427" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="240427"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #44"></div>
  </section>
</div>
    <div class="postbit" id="240428" data-post-id="240428">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="LostKobrakai" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/LostKobrakai/120/3072_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  LostKobrakai
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="stefanluptak" data-post="45" data-topic="24623">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/48/34398_2.png" class="avatar"> stefanluptak:</div>
<blockquote>
<p>I can’t move the <code>broadcast!</code> call into the controller, because sometimes the <code>MySystem.create_user/1</code> function can be called from another place.</p>
</blockquote>
</aside>
<p>That’s I guess the missing piece here. Do you want to live with that coupling? If yes then <code>Endpoint</code> is a dependency. If not then you need to figure out a way to have <code>create_user</code> work even when the endpoint is not available.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="240428" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/46">Post #45</a>
	                </div>
	            </div>
              <div id="likers-container-240428" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="240428"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #45"></div>
  </section>
</div>
    <div class="postbit" id="240431" data-post-id="240431">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="stefanluptak" data-post="45" data-topic="24623">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/48/34398_2.png" class="avatar"> stefanluptak:</div>
<blockquote>
<p>How should I organize my code to prevent this kind of boundaries violation?</p>
</blockquote>
</aside>
<p>A couple of ideas:</p>
<ol>
<li>Make <code>create_user</code> return something like <code>[Notification.t()]</code> (i.e. a list of notifications), leaving it to the caller to send notifications. This will work as long as in every execution path there is a caller (direct or indirect) which is from the web namespace.</li>
<li>Broadcast through plain <a href="https://hexdocs.pm/phoenix_pubsub/Phoenix.PubSub.html" rel="noopener nofollow ugc">Phoenix.PubSub</a> instead.</li>
<li>Have <code>create_user</code> accept a notifier as dependency (a parameter which is a function or a module implementing some notifier behaviour). The limitation is the same as in 1.</li>
<li>A variation of 3 is to get the dependency (e.g. a notifier module) from the app env. The limitation then disappears.</li>
</ol>
<p>This is roughly the order of my personal preference, though I wouldn’t want to generalize.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="240431" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/47">Post #46</a>
	                </div>
	            </div>
              <div id="likers-container-240431" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="240431"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #46"></div>
  </section>
</div>
    <div class="postbit" id="240900" data-post-id="240900">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stefanluptak" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/120/34398_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stefanluptak
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks a lot for your responses. I am trying to gradually incorporate <code>Boundary</code> into our project and I think I need another advice or a bit of brainstorming about module organization.</p>
<p>I am creating a context called <code>Billing</code> that does all things related to billing. So imagine this very simplified situation:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MySystem.Billing do
  alias MySystem.Billing.Subscription
  alias MySystem.Billing.PaymentMethod
  # ...
  
  @spec create_subscription(String.t(), integer()) :: 
    {:ok, Subscription.t()} | {:error, :blah}
  def create_subscription(customer_name, quantity) do
    case something() do
      nil -&gt;
        {:error, :blah}

      something -&gt;
        Subscription.create(customer_name, quantity, something)
    end
  end

  def cancel_subscription(subscription_id) do
    # ...
  end
end
</code></pre>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MySystem.Billing.Subscription do
  defstruct [:customer_name, :quantity, :something]
  @type t :: %__MODULE__{
    # ... 
  }

  @spec create(String.t(), integer(), any()) :: {:ok, t()}
  def create(customer_name, quantity, something) do
    # call API directly
  end
end
</code></pre>
<p>Context module has all the business logic and the child modules are just data structures with a basic CRUD logic.</p>
<p>I want to hide the CRUD functions to prevent invalid states and at the same time, I want to export the child modules, so I can pattern match on the structs when calling the <code>Billing</code> context functions from controllers, tests or other places.</p>
<p>I can think of two approaches:</p>
<ol>
<li>Move all the logic from the child modules into the context module.</li>
<li>Use the child modules just as a pure data structures.</li>
<li>That will result into giant context module, but will be very clean from the API perspective. Then I may not even need the <code>Boundary</code> library for this.</li>
</ol>
<p>or</p>
<ol>
<li>Move all the logic from the child modules into some kind of <code>Billing.Action.*</code> or <code>Billing.Service.*</code> modules which will be basically just the one big <code>Billing</code> context module split into multiple smaller ones to improve readability and maintainability.</li>
<li>Move the pure data structures under <code>Billing.Data.*</code> for example.</li>
<li>Then I can do <code>use Boundary, exports: [Data]</code> in my context module.</li>
</ol>
<p>What do you think? Any insight would be very appreciated. Thanks. <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="240900" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/48">Post #47</a>
	                </div>
	            </div>
              <div id="likers-container-240900" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="240900"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #47"></div>
  </section>
</div>
    <div class="postbit" id="240938" data-post-id="240938">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Great question, and also I think a great example of how boundary motivates developers to think about the code organization <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20">  You could have of course asked the same questions even without using boundary, but I think that the library makes such design issues more obvious.</p>
<p>I personally wouldn’t keep <code>create</code> &amp; co in the <code>Subscription</code> module. Instead I’d place them in some other context module. This is IMO following the ideas of various elaborate architectural styles, such as Onion, Clean, or DDD, by separating domain entities from use-cases/services.</p>
<p>That doesn’t mean that a “data” module, such as <code>Subscription</code>, shouldn’t have any logic. A frequent example are query functions which return some derived information is fine (e.g. <code>Order.total_price</code> which sums the price of each order item). But in general, I avoid adding db logic into such modules.</p>
<p>So this begs the question where should <code>create</code> reside? I initially put it in the same module where it’s used (in this case <code>MySystem.Billing</code>). If the code of that module grows, I’ll consider possible split opportunities, e.g. extracting peer modules (i.e. top-level exported context modules), and/or moving some parts into one or more internal modules. The actual split decision depends on the actual code. As an aside, there’s a helper task <a href="https://hexdocs.pm/boundary/Mix.Tasks.Boundary.Visualize.Funs.html#content" rel="noopener nofollow ugc">mix boundary.visualize.funs</a>, which will generate the graph of in-module cross-function dependencies. This can be helpful when choosing a split strategy.</p>
<p>Where should we store data modules? I don’t have a clear answer. First, I should note that I never used a pure Ecto-independent data model. But even with Ecto schemas, this challenge is similar. In the past I stashed my Ecto schemas under <code>MySystem.Schemas.*</code>. A nice perk is that you can then <a href="https://hexdocs.pm/boundary/Boundary.html#module-mass-exports" rel="noopener nofollow ugc">mass export all such modules</a>. Perhaps a more important benefit of such organization is that you don’t have to deal with weird names, such as <code>Accounts</code> (use-case) and <code>Accounts.Account</code> (data), which I find cringey. When data modules are stashed under a separate namespace, then we can easily use e.g. <code>Data.Subscription</code> (data) and <code>Subscription</code> (use-case) in the same client module.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="240938" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/49">Post #48</a>
	                </div>
	            </div>
              <div id="likers-container-240938" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="240938"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #48"></div>
  </section>
</div>
    <div class="postbit" id="240960" data-post-id="240960">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stefanluptak" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/120/34398_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stefanluptak
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you for you ideas and opinions Saša.</p>
<p>You’re right, that now I can see better the issues of my design. Before that it was just a feeling and a small annoyance here and there. Now I can fix that step by step and gain a clear picture thanks to the explicit boundaries.</p>
<p>I remember some of the things you mentioned here from your Maintainable Elixir blog series. I think I have to read them again (and then again :-)).</p>
<p>Thanks again. I have a lot to think about and to refactor.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="240960" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/boundary-enforcing-boundaries-in-elixir-projects/24623/50">Post #49</a>
	                </div>
	            </div>
              <div id="likers-container-240960" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="240960"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>