use PublicInbox::View;
 
 # main function
-# FIXME: takes too many args, cleanup
 sub generate {
-       my ($class, $git_dir, $max, $pi_config, $listname, $cgi, $top) = @_;
-       $max ||= 25;
+       my ($class, $args) = @_;
+       my $max = $args->{max} || 25;
+       my $top = $args->{top}; # bool
 
-       local $ENV{GIT_DIR} = $git_dir;
-       my $feed_opts = get_feedopts($pi_config, $listname, $cgi);
+       local $ENV{GIT_DIR} = $args->{git_dir};
+       my $feed_opts = get_feedopts($args);
 
        my $feed = XML::Atom::SimpleFeed->new(
                title => $feed_opts->{description} || "unnamed feed",
 
 # private functions below
 sub get_feedopts {
-       my ($pi_config, $listname, $cgi) = @_;
+       my ($args) = @_;
+       my $pi_config = $args->{pi_config};
+       my $listname = $args->{listname};
+       my $cgi = $args->{cgi};
        my %rv;
+
        if ($pi_config && defined $listname && length $listname) {
                foreach my $key (qw(description address)) {
                        $rv{$key} = $pi_config->get($listname, $key);
 
        print $cgi->header(-type => "application/xml", -charset => 'us-ascii',
                                -status => '200 OK');
 
-       print PublicInbox::Feed->generate($git_dir, undef,
-                                       $pi_config, $listname, $cgi);
+       print PublicInbox::Feed->generate({
+               git_dir => $git_dir,
+               pi_config => $pi_config,
+               listname => $listname,
+               cgi => $cgi
+       });
 }
 
 # /$LISTNAME/index.atom.xml    -> Atom feed
        require PublicInbox::Feed;
        print $cgi->header(-type => "application/xml", -charset => 'us-ascii',
                                -status => '200 OK');
-
-       print PublicInbox::Feed->generate($git_dir, undef,
-                                       $pi_config, $listname, $cgi, 1);
+       print PublicInbox::Feed->generate({
+               git_dir => $git_dir,
+               pi_config => $pi_config,
+               listname => $listname,
+               cgi => $cgi,
+               top => 1
+       });
 }
 
 
        # check initial feed
        {
-               my $feed = PublicInbox::Feed->generate($git_dir, 3);
+               my $feed = PublicInbox::Feed->generate({
+                       git_dir => $git_dir,
+                       max => 3
+               });
                if ($have_xml_feed) {
                        my $p = XML::Feed->parse(\$feed);
                        is($p->format, "Atom", "parsed atom feed");
 
        # check spam shows up
        {
-               my $spammy_feed = PublicInbox::Feed->generate($git_dir, 3);
+               my $spammy_feed = PublicInbox::Feed->generate({
+                       git_dir => $git_dir,
+                       max => 3
+               });
                if ($have_xml_feed) {
                        my $p = XML::Feed->parse(\$spammy_feed);
                        is($p->format, "Atom", "parsed atom feed");
 
        # spam no longer shows up
        {
-               my $feed = PublicInbox::Feed->generate($git_dir, 3);
+               my $feed = PublicInbox::Feed->generate({
+                       git_dir => $git_dir,
+                       max => 3
+               });
                if ($have_xml_feed) {
                        my $p = XML::Feed->parse(\$feed);
                        is($p->format, "Atom", "parsed atom feed");