class Avo::HTML::Builder

def assign_property(property = :data, payload = nil, &block)

Parse the properties and assign them to the blocks
def assign_property(property = :data, payload = nil, &block)
  value = Avo::ExecutionContext.new(target: block || payload, record: record).handle
  send(:"#{property}_stack=", value)
end

def build

Fetch the menu
def build
  self
end

def capture_block(property = nil, &block)

Capture and parse the blocks for the nested structure
def capture_block(property = nil, &block)
  send(:"#{property}_stack=", self.class.parse_block(record: record, resource: resource, &block).build)
end

def classes(payload = nil, &block)

payload or block
def classes(payload = nil, &block)
  assign_property :classes, payload, &block
end

def content(&block)

Takes a block
def content(&block)
  capture_block :content, &block
end

def current_user

def current_user
  Avo::Current.user
end

def data(payload = nil, &block)

payload or block
def data(payload = nil, &block)
  assign_property :data, payload, &block
end

def dig_stack(*names)

def dig_stack(*names)
  value = get_stack names.shift
  if value.is_a? self.class
    value.dig_stack(*names)
  else
    value
  end
end

def edit(&block)

Takes a block
def edit(&block)
  capture_block :edit, &block
end

def get_stack(name = nil)

def get_stack(name = nil)
  # We don't have an edit component for new so we should use edit
  name = :edit if name == :new
  send :"#{name}_stack"
end

def index(&block)

Takes a block
def index(&block)
  capture_block :index, &block
end

def initialize(record: nil, resource: nil)

def initialize(record: nil, resource: nil)
  @wrapper_stack = {}
  @data_stack = {}
  @style_stack = ""
  @classes_stack = ""
  @show_stack = {}
  @edit_stack = {}
  @index_stack = {}
  @input_stack = {}
  @label_stack = {}
  @content_stack = {}
  @record = record
  @resource = resource
end

def input(&block)

Takes a block
def input(&block)
  capture_block :input, &block
end

def label(&block)

Takes a block
def label(&block)
  capture_block :label, &block
end

def parse_block(record: nil, resource: nil, &block)

def parse_block(record: nil, resource: nil, &block)
  Docile.dsl_eval(Avo::HTML::Builder.new(record: record, resource: resource), &block).build
end

def show(&block)

Takes a block
def show(&block)
  capture_block :show, &block
end

def style(payload = nil, &block)

payload or block
def style(payload = nil, &block)
  assign_property :style, payload, &block
end

def wrapper(&block)

Takes a block
def wrapper(&block)
  capture_block :wrapper, &block
end