1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
package Git::Repository::Plugin;
$Git::Repository::Plugin::VERSION = '1.326';
use strict;
use warnings;
use 5.006;
use Carp;
sub install {
my ( $class, @keywords ) = @_;
# get the list of keywords to install
my %keyword = map { $_ => 1 } my @all_keywords = $class->_keywords;
@keywords = @all_keywords if !@keywords;
@keywords = grep {
!( !exists $keyword{$_} and carp "Unknown keyword '$_' in $class" )
} @keywords;
carp "No keywords installed from $class" if !@keywords;
# install keywords
no strict 'refs';
*{"Git::Repository::$_"} = \&{"$class\::$_"} for @keywords;
}
sub _keywords {
my ($class) = @_;
carp "Use of \@KEYWORDS by $class is deprecated";
no strict 'refs';
return @{"$class\::KEYWORDS"};
}
1;
__END__
=head1 NAME
Git::Repository::Plugin - Base class for Git::Repository plugins
=head1 SYNOPSIS
package Git::Repository::Plugin::Hello;
use Git::Repository::Plugin;
our @ISA = qw( Git::Repository::Plugin );
sub _keywords { return qw( hello hello_gitdir ) }
sub hello { return "Hello, git world!\n"; }
sub hello_gitdir { return "Hello, " . $_[0]->git_dir . "!\n"; }
1;
=head1 DESCRIPTION
L<Git::Repository::Plugin> allows one to define new methods for
L<Git::Repository>, that will be imported in the L<Git::Repository>
namespace.
The L<SYNOPSIS> provides a full example.
The documentation of L<Git::Repository> describes how to load plugins
with all the methods they provide, or only a selection of them.
=head1 METHODS
L<Git::Repository::Plugin> provides a single method:
=head2 install
$plugin->install( @keywords );
Install all keywords provided in the L<Git::Repository> namespace.
If called with an empty list, will install all available keywords.
=head1 SUBCLASSING
=head2 Adding methods to L<Git::Repository>
When creating a plugin, the new keywords (i.e. methods) that are added
by the plugin to L<Git::Repository> must be returned by a C<_keywords()>
method.
=head2 Adding attributes to L<Git::Repository>
L<Git::Repository> is a blessed hash reference.
If extra attributes are needed, the recommended name for the hash key (to
avoid name clashes between plugins) is C<_plugin_I<name>_I<attribute>>,
where I<name> is the plugin lowercase name, and I<attribute> is the
attribute name.
=head1 AUTHOR
Philippe Bruhat (BooK) <book@cpan.org>
=head1 ACKNOWLEDGEMENTS
Thanks to Todd Rinaldo, who wanted to add more methods to
L<Git::Repository>, which made me look for a solution that would preserve
the minimalism of L<Git::Repository>.
After a not-so-good design using @ISA (so L<Git::Repository> would
I<inherit> the extra methods), further discussions with Aristotle
Pagaltzis and a quick peek at L<Dancer>'s plugin management helped me
come up with the current design. Thank you Aristotle and the L<Dancer>
team.
Further improvements to the plugin system proposed by Aristotle Pagaltzis.
=head1 COPYRIGHT
Copyright 2010-2016 Philippe Bruhat (BooK), all rights reserved.
=head1 LICENSE
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
|