The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
-- ->fill should do the right thing when the current element is DL etc.
-- when doing ->select and there's only one optgroup do the right thing
-- table helpers ???
-- review docs especially the form docs.
-- lace-context, lace-repeat ...?
-- <$.method> => sub method { $self, $dom, %stuff } ...??
      <tag lace-call='$.render_user?links=$.links' />
-- Above would work for components also like
    <View-Form action=$.action>
      <View-Form.input name='user' />
    </View-Form>
-- <div lace-id='content' lace-id@href='link'>Stuff</div>
    $dom->lace_data
      ->content($self->story)
      ->link($self->uri('info'));
-- Review all docs and maybe cookbook?
-- allow <tag lace-component='View-User'>
        <tag lace-component='View-User?links=$.links' /> ???
-- ALlow template to assign method on attribute??
      <tag class=[$.set_class] />  ==> sub { my ($self, $tag_dom) = @_; return 'class' }


---
### Annotations example

  package MyApp::DisplayModel::User;

  use Moose;
  use Lace::AttributeAnnotations;
  use MyApp::Types;

  has 'name', (
    is=>'ro',
    isa=>String,
    display_html=>sub {
      my ($self, $data, $dom) = @_;
      $dom->at('#user-name', $data);
    });

  has 'friends, (
    is=>'ro',
    isa=>ArrayRef[Person],
    display_hmtl=> sub {
      my ($self, $data, $dom) = @_;
      $dom->ul('#friends, $data)
  );

# This idea will work better with binds

== How to let a compent control the init args of subcomponents

# The idea is that the sub component gets it args from
# the contaiing componet
 <lace-form errors='$.form.errors' ...>
  <input errors='$.errors.age' value='$.values.age' title='$self.title' />
 </lace-form>

Starting to lean toward something like

$dom->at('#content')
  ->content( $self->process_components( $self->content))

or mayb $self->content->process_components( ctx=>$self->formdata, ...)

might have to move the concept of compoents into Template::Lace::DOM 
to get this right. 

Ok now if we move components to the DOM we can support 
->attach

==== END

<Lace-Status.show>
<p>
  This is a test <info:status/>.  For More information
  click <a info:href >here</a>
</p>
</Lace-Status.show>

package MyApp::Lace::Status;

sub show {
  my ($self, $dom) = @_;
  $dom->bind('info', 
    status => $self->status,
    href => $self->uri('info'), # canonically +{ href => $self->uri('info') },
  );
}

<section id="todos">
  <lace-todos.count>
    <p>
      Hi there <person:name />! Here's you're work list!
    </p>
    <ol>
      <li data-person='todos'><todo:name/></li>
    </ol>
  </lace-todos.count>
</section>

package MyApp::Lace::Todos;

sub dispatch { 
  my ($self, $name, @args) = @_;
  return $self->display(@args) if $name eq 'count';
}

sub display {
  my ($self, $dom) = @_;
  $dom->bind('person', 
    name => $self->person->name,
    todos => sub { $self->list_todos($_) },
  );
}

sub list_todos {
  my ($self, $dom) = @_;
  $dom->repeat(sub {
    my ($dom, $todo) = @_;
    $dom->bind('todo', name => $todo->name)
  }, $self->person->todos);
}

# =================

sub process_dom {
  my ($self, $dom) = @_;
  $dom->bind('links',
    add_task => { action=>$self->uri('add') },
    clear_completed => { action=>$self->uri('clear_completed') },
    show_all => $self->build_summary_url('all'),
    show_active => $self->build_summary_url('active'),
    show_completed => $self->build_summary_url('completed'),
  )->bind('todos',
    active_count => $self->active_task_count,
    set => sub { $self->list_todos($_) },
  );
}

  my ($self, $dom) = @_;
  $dom->bind('links',
    add_task => { action=>$self->uri('add') },
    clear_completed => { action=>$self->uri('clear_completed') },
    show_all => $self->build_summary_url('all'),
    show_active => $self->build_summary_url('active'),
    show_completed => $self->build_summary_url('completed'),
  )->bind('todos',
    active_count => $self->active_task_count,
    set => sub { $self->list_todos($_) },
  );
}


sub build_summary_url {
  my ($self, $set) = @_;
  return +{
    action => $self->uri('summary',{q=>$set}),
    class => $self->set eq $set ? 'selected':undef,
  };
}

sub list_todos {
  my ($self, $dom) = @_;
  $dom->repeat(sub {
    my ($dom, $todo) = @_;
    $dom->bind('todo',
      update_action => +{ action => $self->uri('/task/update', [$todo->todo_id]) },
      destroy_action => +{ action => $self->uri('/task/delete', [$todo->todo_id]) },
      display_label => $todo->title,
      title_input => sub { $_->value($todo->title) }
      task_id => +{ 'id+' => $todo->id },
      form_id => +{ 'id+' => $todo->id },
      data_id => +{ 'data-task' => $todo->id },
      completed => sub { $self->mark_completed($_) },
    );
  }, $self->todos);
}

sub mark_completed {
  my ($self, $dom) = @_;
  $dom->data('is_complete',
    'checkbox@checked' => $self->completed,
    'display_class@class' => ($todo->completed ? "completed": undef),
  );
}


=======

<section id="todos">
  <lace-todos.count>
    <p>
      Hi there <span data-person='name'>PERSON</span>! Here's you're work list!
    </p>
      <ol>    
        <li data-person='todos'>
          <span data-todo='title'>THING TODO</span>
        </li>
      </ol>
  </view-todos>
</section>

package MyApp::Lace::Todos;

sub dispatch { 
  my ($self, $name, @args) = @_;
  return $self->display(@args) if $name eq 'count';
}

sub display {
  my ($self, $dom) = @_;
  $dom->data('person', 
    name => $self->person->name,
    todos => sub { $self->list_todos($_) },
  );
}

sub list_todos {
  my ($self, $dom) = @_;
  $dom->repeat(sub {
    my ($dom, $todo) = @_;
    $dom->data('todo', name => $todo->name)
  }, $self->person->todos);
}

=======

## The idea here is to locallzie $_ to self and %_ to 'by'
## for easier??

<section id="todos">
    <p data-lace='$.info>
      Hi there <span data-person='name'>
        <a data-person@href='resumelink'>
          PERSON
        </a></span>! Here's you're work list!
    </p>
      <ol>
        <li data-lace='@.list-todos'>
          <span data-todo='title Str'>THING TODO</span>
        </li>
      </ol>
</section>

package MyApp::Lace::Todos;

sub info {
  $_{person}
    ->name($_->person->name)
    ->resumelink($_->person->resume_link);
}

sub list_todos {
  return $_->person
    ->todos
    ->map(sub {
      $_{todo}->clone
        ->title($_->title);
    });
}

---

<li class=[.listclass]>
  ...
</li>


sub listclass {
  my ($self, $li) = @_;
  return $self->completed ? 'completed : undef;
}

===

sub template {qq[
  <ol>
    <view-todo task=$.task />
  </ol>
]}

sub process_dom {
  my ($self, $dom) = @_;
  $dom->component('view-todo')
    ->first
    ->repeat(sub {
        my ($dom, $task) = @_;
        $dom->process_component({task=>$task})
      }, $self->tasks);
}

---

sub template { '<ol></ol>' }

sub process_dom {
  my ($self, $dom) = @_;
  $dom->append_child($self->ctx->view('Todo', task=>$_)
    for @{$self->tasks};
}

--------

<ul lace-method="$.display_links"
    class="nav navbar-nav navbar-right">
  <li><a lace='link_title'
    return $dom;
  }, $self->links);
}

----------
-- EXAMPLE that lets template author set a context
----------

<ul @repeat="$.links" lace-method="$.display_links"
    class="nav navbar-nav navbar-right">
  <li><a lace='link_title'
      lace@href='href'
      lace@class='is_active'>
    Link
  </a></li>
</ul>

-- Should the render 'at' methods retunr the DOM or do they 
-- get to just modify it inline like 'process_fdom'..?

<$.render_links linkbase='/foo'>
  <section>
    <p><lace:title/></p>
    <ul>
      <li>
        <lace:links>
          <a lace@href='link'>
            <lace:description/>
          </a>
        </lace:links>
      </li>
    </ul>
  </section>
</$.render_links>

<section lace-do='$.render_links?linkbase=/foo'>
  <p lace='title'></p>
  <ul>
    <li lace='links'>
      <a lace='description'
          lace@href='link'>
        Link Link
      </a>
    </li>
  </ul>
</section>

sub render_links {
  my ($self, $dom, %args) = @_;
  $dom->by
    ->title('Hello World')
    ->links(sub {
      my ($li) = @_;
      $li->repeat(sub {
        my ($cloned_li$, $link) = @_;
        $cloned_li->by
          ->description($link->description)
          ->link($link->url($arg{linkbase}));
        return $cloned_li;
      }, $self->links);
      return $li;
    });
}

sub render_links {
  my ($self, $dom, %args) = @_;
  $dom->by
    ->title('Hello World')
    ->repeat::links($self->curry::render_link, $self->links);
}

sub render_link {
  my ($self, $li, $link) = @_;
  return $li->by
    ->description($link->description)
    ->link($link->url($arg{linkbase}));
}

#??     'links::repeat' => [$self->curry::render_link, $self->links],

sub render_links {
  my ($self, $dom, %args) = @_;
  $dom->fill({
    title => 'Hello World',
    links => sub { shift->repeat(self->curry::render_link($arg{linkbase}), $self->links) },
  });
}

sub render_link {
  my ($self, $li, $base, $link) = @_;
  $li->fill({
    description => $link->description,
    link => sub { shift->attr(href=> $link->url($base)),
  });
}

=============

package UITable;

sub process_dom {
  my ($self, $dom) = @_;
  my $tr_dom = $self->tr;

}


<UITable row=$.list>
  <UITable.tr>
    <tr>
      <td></td>
    </tr>
  </UITable.tr>
</UITable