NAME

WWW::Kickstarter::Data::Categories - Kickstarter categories

SYNOPSIS

   use WWW::Kickstarter;

   my $email    = '...';  # Your Kickstarter login credentials
   my $password = '...';

   my $ks = WWW::Kickstarter->new();
   $ks->login($email, $password);

   my $categories = $ks->categories();

   $categories->visit(sub{
      my ($category, $depth, $visit_next) = @_;
      say "   " x $depth, $category->name;
      1 while $visit_next->();
   });

ACCESSORS

my @categories = $categories->categories;

Returns a WWW::Kickstarter::Data::Category object for each Kickstarter category.

my @categories = $categories->top_level_categories;

Returns a WWW::Kickstarter::Data::Category object for each top-level Kickstarter category.

API CALLS

refetch

   $categories = $categories->refetch();

Refetches the categories from Kickstarter.

This ensures the data is up to date, and it will populate fields that may not be provided by objects created by some API calls.

METHODS

visit

   sub visitor {
      my ($category, $depth, $visit_next, $num_subcategories, @args) = @_;
      ...
   }

   $categories->visit(\&visitor, @args);

   $categories->visit({ visitor => \&visitor, %opts }, @args);

Traverses the category hiearchy in a depth-first, alphabetical manner.

The visitor is called with the following arguments:

  • $category

    A category as an WWW::Kickstarter::Data::Category object.

  • $depth

    The depth of the category in the hierarchy, zero for top-level categories.

  • $visit_next

    A code reference that visits one subcategory each time it's called. Unless you want to avoid visiting a category's subcategories, it should be called until it returns false.

  • $num_subcategories

    The number of subcategories this category has. The following are basically equivalent:

    • 1 while $visit_next->(); =item * $visit_next->() for 1..$num_subcategories;

  • @args

    The values passed to visit or &$visit_next.

Options:

  • root => 1

    The visitor will be called one extra time for the root of the tree. $category will be undefined in the visitor for this call. The root will have a depth of zero, so the top-level categories will have a depth of one.

Examples

  • Simple Example

       $categories->visit(sub{
          my ($category, $depth, $visit_next) = @_;
          say "   " x $depth, $category->name;
          1 while $visit_next->();
       });

    Output:

       Art
          Crafts
          Digital Art
          ...
          Sculpture
       Comics
       Dance
       Design
          Graphic Design
          Product Design
       ...
  • Passing data down to subcategories.

       $categories->visit(sub{
          my ($category, $depth, $visit_next, undef, $parent) = @_;
          say $parent . $category->name;
          1 while $visit_next->($parent . $category->name . '/');
       }, '');

    Output:

       Art
       Art/Crafts
       Art/Digital Art
       ...
       Art/Sculpture
       Comics
       Dance
       Design
       Design/Graphic Design
       Design/Product Design
       ...
  • Complex example

       $categories->visit({
          root    => 1,
          visitor => sub{
             my ($category, $depth, $visit_next, $num_subcategories, $subcategory_idx) = @_;
    
             if ($category) {
                my $class = $subcategory_idx % 2 ? 'odd' : 'even';
                print qq{<li class="$class">} . $category->name;
             }
    
             if ($num_subcategories) {
                say "<ul>";
                for my $subcategory_idx (1..$num_subcategories) {
                   $visit_next->($subcategory_idx);
                }
                say "</ul>";
             }
    
             if ($category) {
                say "</li>"
             }
          },
       });

    Output:

       <ul>
       <li class="odd">Art<ul>
       <li class="odd">Crafts</li>
       <li class="even">Digital Art</li>
       ...
       <li class="even">Sculpture</li>
       </ul>
       </li>
       <li class="even">Comics</li>
       <li class="odd">Dance</li>
       <li class="even">Design<ul>
       <li class="odd">Graphic Design</li>
       <li class="even">Product Design</li>
       </ul>
       </li>
       ...
       </ul>

VERSION, BUGS, KNOWN ISSUES, DOCUMENTATION, SUPPORT, AUTHOR, COPYRIGHT AND LICENSE

See WWW::Kickstarter