Index: Dev/github/GitHubBackup.pm
===================================================================
--- Dev/github/GitHubBackup.pm	(revision f7f894dfd3b469e53c82ca3466408c58c897dd61)
+++ Dev/github/GitHubBackup.pm	(revision 13e240051b38965d9bcdf26e6f638fc0468cad56)
@@ -1,3 +1,3 @@
-package utils;
+package GitHubBackup::API;
 use strict;
 use warnings;
@@ -8,6 +8,14 @@
 use JSON;
 
+sub new {
+    my $class = shift;
+    my $args  = shift;
+    
+    return bless $args, $class;
+}
+
 sub json_api {
-    my $url = shift;
+    my $self = shift;
+    my $url  = shift;
     
     my $ua = LWP::UserAgent->new;
@@ -24,5 +32,6 @@
 
 sub get {
-    my $url = shift;
+    my $self = shift;
+    my $url  = shift;
     my %parameters = @_;
     
@@ -35,5 +44,5 @@
     my $data = [];
     while(1) {
-        my $result = json_api("$url?per_page=100&page=$page$parameters");
+        my $result = $self->json_api("$url?per_page=100&page=$page$parameters");
         if (ref($result) eq 'ARRAY' && scalar @$result > 0) {
             push @$data, @$result;
@@ -48,4 +57,11 @@
 }
 
+sub access_token {
+    my $self = shift;
+    
+    return $self->{access_token}->();
+}
+
+
 package GitHubBackup;
 
@@ -100,4 +116,27 @@
 }
 
+sub access_token {
+    my $self = shift;
+    my $args = shift;
+    
+    if (defined $args) {
+        $self->{access_token} = $args;
+    }
+    
+    return $self->{access_token};
+}
+
+sub api {
+    my $self = shift;
+    
+    unless ($self->{api}) {
+        $self->{api} = GitHubBackup::API->new({
+            access_token => sub {$self->access_token},
+        });
+    }
+    
+    return $self->{api};
+}
+
 sub repos {
     my $self = shift;
@@ -109,8 +148,8 @@
     my $result;
     if (my $repository = $self->repository) {
-        $result = [ utils::json_api("/repos/$account/$repository") ];
+        $result = [ $self->api->json_api("/repos/$account/$repository") ];
     }
     else {
-        $result = utils::get("/users/$account/repos");
+        $result = $self->api->get("/users/$account/repos");
     }
     
@@ -119,4 +158,5 @@
             GitHubBackup::Repository->new({
                 directory => sub {$self->directory},
+                api       => sub {$self->api},
                 repos     => $repos,
             })
@@ -194,4 +234,10 @@
 }
 
+sub api {
+    my $self = shift;
+    
+    return $self->{api}->();
+}
+
 sub message {
     my $self = shift;
@@ -237,5 +283,5 @@
     return $self->{forks} if ($self->{forks});
     
-    $self->{forks} = utils::get("/repos/" . $self->full_name . "/forks");
+    $self->{forks} = $self->api->get("/repos/" . $self->full_name . "/forks");
     
     return $self->{forks};
@@ -292,6 +338,6 @@
     return $self->{issues} if ($self->{issues});
     
-    my $open   = utils::get("/repos/" . $self->full_name . "/issues");
-    my $closed = utils::get("/repos/" . $self->full_name . "/issues", state => 'closed');
+    my $open   = $self->api->get("/repos/" . $self->full_name . "/issues");
+    my $closed = $self->api->get("/repos/" . $self->full_name . "/issues", state => 'closed');
     
     if ($open)   { push @{$self->{issues}}, @$open }
