function post_list()
{
    // only run on the first call
    if (!Registry::has('rwar_post_archive')) {
        // capture original article if one is set
        if ($article = Registry::get('article')) {
            Registry::set('original_article', $article);
        }
    }
    if (!($posts = Registry::get('rwar_post_archive'))) {
        $posts = Post::where('status', '=', 'published')->sort('created', 'desc')->get();
        Registry::set('rwar_post_archive', $posts = new Items($posts));
    }
    if ($result = $posts->valid()) {
        // register single post
        Registry::set('article', $posts->current());
        // move to next
        $posts->next();
    } else {
        // back to the start
        $posts->rewind();
        // reset original article
        Registry::set('article', Registry::get('original_article'));
        // remove items
        Registry::set('rwar_post_archive', false);
    }
    return $result;
}
/**
 * Returns true while there are still tagged posts in the array.
 * This replaces the Anchor posts() method
 *
 * @return bool
 */
function tagged_posts()
{
    $tag = extract_tag();
    if ($tag != '') {
        if (!($posts = Registry::get('tagged_posts'))) {
            $tagged_posts = get_posts_with_tag($tag);
            $posts = Post::where_in('id', $tagged_posts)->where('status', '=', 'published')->sort('created', 'desc')->get();
            Registry::set('tagged_posts', $posts = new Items($posts));
        }
        if ($posts instanceof Items) {
            if ($result = $posts->valid()) {
                // register single post
                Registry::set('article', $posts->current());
                // move to next
                $posts->next();
            } else {
                $posts->rewind();
            }
            return $result;
        }
    } else {
        return posts();
    }
    return false;
}