NAME

ACME::2026 - Checklists for glorious 2026 goals

VERSION

Version 0.01

SYNOPSIS

use ACME::2026 qw(:all);

my $plan = plan_new(
  title => '2026',
  storage => '2026.json',
  autosave => 1,
);

my $id = add_item($plan, 'Run a marathon',
  list => 'Health',
  due => '2026-10-01',
  tags => [qw/fitness endurance/],
  priority => 2,
);

complete_item($plan, $id, note => 'Signed up for NYC');
my @open = items($plan, status => 'todo', list => 'Health', sort => 'due');

plan_save($plan);

DESCRIPTION

ACME::2026 is a tiny functional API for keeping 2026 checklists. It stores plans as plain Perl hashrefs and can persist them to JSON.

DATA MODEL

Plan hashref:

{
  title       => '2026',
  items       => [ ... ],
  next_id     => 1,
  created_at  => '2026-01-01T12:00:00Z',
  updated_at  => '2026-01-01T12:00:00Z',
  storage     => '2026.json',
  autosave    => 1,
}

Item hashref:

{
  id         => 1,
  title      => 'Run a marathon',
  status     => 'todo',
  list       => 'Health',
  tags       => ['fitness'],
  priority   => 2,
  due        => '2026-10-01',
  notes      => [ { note => 'Signed up', at => '2026-02-10T09:00:00Z' } ],
  created_at => '2026-01-01T12:00:00Z',
  updated_at => '2026-02-10T09:00:00Z',
}

Status values are todo, done, or skipped. Dates are ISO 8601 strings (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ).

FUNCTIONS

plan_new

my $plan = plan_new(%opts);

Creates a new plan hashref. Supported options:

title    - plan title (default: 2026)
storage  - JSON path used by plan_save and autosave
autosave - boolean, save after mutating operations

plan_load

my $plan = plan_load($path, %opts);

Loads a JSON file from $path. The plan is normalized to ensure required fields exist. You can override title or autosave with %opts.

plan_save

plan_save($plan);
plan_save($plan, $path);

Writes the plan as JSON. Uses $plan->{storage} if no path is provided.

add_item

my $id = add_item($plan, $title, %opts);

Adds an item and returns its id. Supported options:

list, tags (arrayref or string), priority, due, note

update_item

my $item = update_item($plan, $id, %attrs);

Updates a few fields in place: title, list, tags, priority, due. Use add_note or the status helpers for notes and status changes.

delete_item

my $item = delete_item($plan, $id);

Removes an item and returns it.

get_item

my $item = get_item($plan, $id);

Returns the item or undef if it does not exist.

add_note

add_note($plan, $id, $note);

Appends a note with a timestamp.

complete_item

complete_item($plan, $id, %opts);

Sets the status to done. If note is supplied, it is added.

skip_item

skip_item($plan, $id, %opts);

Sets the status to skipped. If note is supplied, it is added.

reopen_item

reopen_item($plan, $id, %opts);

Sets the status back to todo. If note is supplied, it is added.

items

my @items = items($plan, %filters);

Filters items with any of:

status, list, tag, tags, priority, min_priority, max_priority,
due_before, due_after, sort

For tag or tags, any matching tag is enough. sort supports: due, priority, created, updated, or title. Prefix with - for descending order.

stats

my $stats = stats($plan, %filters);

Returns a hashref with total, todo, done, skipped, and complete_pct.

AUTHOR

Will Willis <wwillis@cpan.org>

BUGS

Please report any bugs or feature requests to bug-acme-2026 at rt.cpan.org, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=ACME-2026. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc ACME::2026

You can also look for information at:

ACKNOWLEDGEMENTS

LICENSE AND COPYRIGHT

This software is Copyright (c) 2026 by Will Willis <wwillis@cpan.org>.

This is free software, licensed under:

The Artistic License 2.0 (GPL Compatible)