NAME

Rui::Model::List - a listenable collection


SYNOPSIS

  $list = Rui::Model::List->new;
  $list = Rui::Model::List->new(
     data    => qw[ a b ],
     attach  => 0, # not needed because 0 is default
     events  => {
        RangeAdded   => $self,
        RangeRemoved => $self,
        RangeChanged => $self,
     },
  );
                                    # List State    Event Fired
                                    # ----------    -----------
  $list->set('foo', 1);             # a foo         RangeChanged [index=1, size=1]
  $list->add('x');                  # a foo x       RangeAdded   [index=1, size=1]
  $list->add(['y', 'z'], 0);        # y z a foo x   RangeAdded   [index=0, size=2]
  $list->remove(0, 3);              # foo x         RangeRemoved [index=0, size=3]
  $list->remove(0);                 # x             RangeRemoved [index=0, size=1]
  print $list->getIndexByItem('x'); # 0
  print $list->get(0);              # x
  print $list->itemExists('foo');   # 0
  print $list->getSize;             # 1
  # example of list attaching to item events and re-broadcasting them
  $list = Rui::Model::List->new(
     data    => [map {Rui::Model::Value->new} (0..2)],
     attach  => 1, 
  );
  $list->addListener(RangeChanged => $self);
  $list->get(0)->data('foo');      #               RangeChanged [index=0, size=1]


SUPERCLASS

the Rui::Model::Base manpage


REQUIRES

the Rui::Event::List manpage


EVENTS

RangeAdded
RangeRemoved
RangeChanged
the Rui::Event::List manpage. The list has been modified. $event->index is the first index of change in the list, $event->data is the number of relevant elements.


DESCRIPTION

Note: you cannot put undef values in the list. Use a value model with an undef value.

If attach is true, then you can only put objects that feature Change and Erase events in the list (something like a value model. The list will listen to these events in its children, and update the list listeners.

If attach is false, you can put anything in the list, except undef values.

RangeChanged will only be fired when attach is true.