package utils; use strict; use warnings; use utf8; use Carp qw(croak); use LWP::UserAgent; use JSON; my $ua = LWP::UserAgent->new; my $json = JSON->new->utf8->indent; sub json_api { my $url = shift; my $res = $ua->get( "https://api.github.com$url" ); $res->is_success or croak $res->status_line; return $json->decode($res->content); } package GitHubBackup; use base qw(Class::Accessor::Fast); use strict; use warnings; use utf8; use Carp qw(croak); __PACKAGE__->mk_accessors( qw( directory account repository )); # both hash and hashref are acceptable sub new { my $class = shift; my $args = (ref $_[0] eq 'HASH') ? $_[0] : {@_}; return $class->SUPER::new($args); } sub repos { my $self = shift; my $account = $self->account or croak "account is not set"; if (my $repository = $self->repository) { $self->{repos} = [ GitHubBackup::Repository->new( {full_name => "$account/$repository"} ) ]; return $self->{repos}; } my $page = 1; my @repos; while (1) { my $result = utils::json_api("/users/$account/repos?per_page=100&page=$page"); if (ref($result) eq 'ARRAY' && scalar @$result > 0) { push @repos, @$result; $page++; next; } last; } foreach my $repos (@repos) { push @{$self->{repos}}, GitHubBackup::Repository->new({ full_name => $repos->{full_name}, clone_url => $repos->{clone_url}, }) ; } return $self->{repos}; } package GitHubBackup::Repository; use base qw(Class::Accessor::Fast); use strict; use warnings; use utf8; use Carp qw(croak); 1; __END__