Massive tree action speedup
[catagits/Gitalist.git] / lib / Gitalist / Git / Object.pm
1 use MooseX::Declare;
2 use Moose::Autobox;
3
4 class Gitalist::Git::Object with Gitalist::Git::Serializable is dirty {
5     use MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize;
6
7     use MooseX::Types::Moose qw/Str Int Bool Maybe ArrayRef/;
8     use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
9     use Gitalist::Utils qw/mode_string/;
10     use overload '""' => '_to_string', fallback => 1;
11
12     # repository and sha1 are required initargs
13     has repository => ( isa => 'Gitalist::Git::Repository',
14                      required => 1,
15                      is => 'ro',
16                      weak_ref => 1,
17                      handles => {
18                          _run_cmd => 'run_cmd',
19                          _run_cmd_fh => 'run_cmd_fh',
20                          _run_cmd_list => 'run_cmd_list',
21                          _get_gpp_object => 'get_gpp_object',
22                      },
23                  );
24     has sha1 => ( isa => NonEmptySimpleStr,
25                   required => 1,
26                   is => 'ro' );
27
28     has type => ( isa => NonEmptySimpleStr,
29                   is => 'ro',
30                   required => 1 );
31
32     has $_ => ( isa => NonEmptySimpleStr,
33                 required => 1,
34                 is => 'ro',
35                 lazy_build => 1 )
36         for qw/modestr size/;
37
38     has _gpp_obj => ( isa        => 'Git::PurePerl::Object',
39                       required   => 1,
40                       is         => 'ro',
41                       lazy_build => 1,
42                       handles    => [ 'content' ],
43                       traits     => ['DoNotSerialize']
44                   );
45
46     # objects can't determine their mode or filename
47     has file => ( isa => NonEmptySimpleStr,
48                   required => 0,
49                   is => 'ro' );
50     has mode => ( isa => Int,
51                   required => 1,
52                   default => 0,
53                   is => 'ro' );
54
55     method BUILD { $self->$_() for qw/_gpp_obj size modestr/ }
56
57 ## Private methods
58     method _to_string {
59         return $self->sha1;
60     };
61
62 ## Builders
63     method _build__gpp_obj {
64         return $self->_get_gpp_object($self->sha1)
65     }
66
67     method "_build_size" {
68         my $v = $self->_cat_file_with_flag('s');
69         chomp($v);
70         return $v;
71     }
72
73     method _cat_file_with_flag ($flag) {
74         $self->_run_cmd('cat-file', '-' . $flag, $self->{sha1})
75     }
76
77     method _build_modestr {
78         return mode_string($self->mode);
79     }
80
81 } # end class
82
83 __END__
84
85 =head1 NAME
86
87 Gitalist::Git::Object - Model of a git object.
88
89 =head1 SYNOPSIS
90
91     my $object = Repository->get_object($sha1);
92
93 =head1 DESCRIPTION
94
95 Abstract base class for git objects.
96
97
98 =head1 ATTRIBUTES
99
100
101 =head1 METHODS
102
103
104 =head1 AUTHORS
105
106 See L<Gitalist> for authors.
107
108 =head1 LICENSE
109
110 See L<Gitalist> for the license.
111
112 =cut