Introducing Git::Repository::Plugin::AUTOLOAD
Most git wrappers on CPAN (Git::Wrapper, Git::Class and Git::Sub offer methods (or functions) based on the existing git subcommands (usually limited to a subset of the porcelain commands). Git::Repository is different.
When writing Git::Repository, I was heavily inspired by Git.pm. My design goals were to be as simple as possible, while making it possible to run any git command (even those that both read from STDIN and write to STDOUT). This is why (apart from the version comparison methods), Git::Repository has only two main commands: run
and command
.
I recently realized it might be a good thing to offer methods named after the existing Git subcommands, just like the competition does. However, I do not want to maintain a list of existing subcommands (Git evolves rapidly, and subcommands do too) or do anything special with their output. This is what specialized plugins are for (e.g. Git::Repository::Plugin::Log, which adds a log
method that parses the git log
output, or Git::Repository::Plugin::Status, which adds a status
method that parses the git status
output).
So I went down the AUTOLOAD
route: the Git::Repository::Plugin::AUTOLOAD installs an AUTOLOAD
method that, whenever an unknown method is encountered, will proxy the call to $self->run( $method, ... )
. It will of course not override methods added by plugins.
Given that most of the basic Git commands can be executed through run()
, this can makes the code look a little bit nicer.
Before ($r
is a Git::Repository
object):
$r->run( add => $file );
$r->run( commit => '-m' => 'message' );
my $sha1 = $r->run( 'rev-parse' => 'master' );
Git::Repository->run( clone => $url );
After use Git::Repository 'AUTOLOAD';
:
$r->add($file);
$r->commit( '-m' => 'message' );
my $sha1 = $r->rev_parse('master'); # replace "-" by "_" in command names
Git::Repository->clone( $url ); # can also be used as a class method
So, if Git::Repository's interface was a little too dry for you, maybe this thin layer of syntactic sugar will make you consider using it... :-)
Hi,
I'm using Git::Repository to manage the history of audio projects created using the Nama multitrack audio recorder. I find Git::Repository simple and straightforward. Taking this opportunity to say "Thanks."
Thanks for saying thanks. :-) It's always nice to hear from people using your code. Bug reports and feature requests are welcome too!
Did you know that you can also leave a more detailed technical review at CPAN Ratings?