module Avo::Concerns::BorrowItemsHolder

def parse_block(parent:, **args, &block)

def parse_block(parent:, **args, &block)
  # item = Avo::Resources::Items:: ...
  item = new(parent: parent, **args)
  # Borrow the current items holder to the parent (parent = Action || Resource, etc.)
  # Save parent's items holder to restore it after the block is parsed
  # This is useful when you execute parent's methods like `some_fields_method` inside some DSL block.
  # When you do that, Docile will not find the method in the current object (item), but in the parent.
  # So we need to temporarily replace the parent's items holder with the current one because the parent's methods
  # will be executed in the parent's context.
  # For more context: https://github.com/ms-ati/docile/issues/107
  parent_item_holder = parent.items_holder
  parent.items_holder = item.items_holder
  dsl_evaluation = Docile.dsl_eval(item, &block).build
  # Restore the parent's items holder
  parent.items_holder = parent_item_holder
  dsl_evaluation
end