--- /dev/null
+use MooseX::Declare;
+
+role Gitalist::Git::CollectionOfProjects {
+ use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
+ use MooseX::Types::Moose qw/ArrayRef/;
+ use Moose::Autobox;
+ use aliased 'Gitalist::Git::Project';
+
+ has projects => (
+ is => 'ro',
+ isa => ArrayRef['Gitalist::Git::Project'],
+ required => 1,
+ lazy_build => 1,
+ );
+ method get_project (NonEmptySimpleStr $name) {
+ my $path = $self->_get_path_for_project_name($name);
+ die "Not a valid Project"
+ unless $self->_is_git_repo($path);
+ return Project->new( $path );
+ }
+ # Determine whether a given directory is a git repo.
+ method _is_git_repo ($dir) {
+ return -f $dir->file('HEAD') || -f $dir->file('.git', 'HEAD');
+ }
+ requires qw/
+ _build_projects
+ _get_path_for_project_name
+ /;
+
+ around _build_projects {
+ [sort { $a->name cmp $b->name } $self->$orig->flatten];
+ }
+}
+
+1;
use MooseX::Declare;
-class Gitalist::Git::Repo {
+class Gitalist::Git::Repo with Gitalist::Git::CollectionOfProjects {
use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
use MooseX::Types::Path::Class qw/Dir/;
- use MooseX::Types::Moose qw/ArrayRef/;
- use aliased 'Gitalist::Git::Project';
has repo_dir => (
isa => Dir,
coerce => 1,
);
- has projects => (
- is => 'ro',
- isa => ArrayRef['Gitalist::Git::Project'],
- required => 1,
- lazy_build => 1,
- );
-
method BUILD {
# Make sure repo_dir is an absolute path so that
# ->contains() works correctly.
$self->repo_dir->resolve;
}
- ## Public methods
- method get_project (NonEmptySimpleStr $name) {
+ method _get_path_for_project_name (NonEmptySimpleStr $name) {
my $path = $self->repo_dir->subdir($name)->resolve;
die "Directory traversal prohibited"
unless $self->repo_dir->contains($path);
- die "Not a valid Project"
- unless $self->_is_git_repo($path);
- return Project->new( $path );
+ return $path;
}
## Builders
push @ret, $p;
};
}
-
- return [sort { $a->name cmp $b->name } @ret];
- }
-
- ## Private methods
- # Determine whether a given directory is a git repo.
- method _is_git_repo ($dir) {
- return -f $dir->file('HEAD') || -f $dir->file('.git', 'HEAD');
+ return \@ret;
}
} # end class