The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Padre::Plugin::Snippet;

use 5.008;
use strict;
use warnings;
use Padre::Plugin ();

our $VERSION = '0.01';
our @ISA     = 'Padre::Plugin';

# Child modules we need to unload when disabled
use constant CHILDREN => qw{
	Padre::Plugin::Snippet::Role::NeedsSaveAsEvent
	Padre::Plugin::Snippet::Document
	Padre::Plugin::Snippet::Preferences
	Padre::Plugin::Snippet::FBP::Preferences
};

# Store the current configuration object for _plugin_config consumers
my $config;

# Called when Padre wants to check what package versions this
# plugin needs
sub padre_interfaces {
	'Padre::Plugin' => 0.94, 'Padre::Wx::Editor' => 0.94, 'Padre::Wx::Role::Main' => 0.94;
}

# Called when Padre wants a name for the plugin
sub plugin_name {
	Wx::gettext('Snippet');
}

# Called when the plugin is enabled by Padre
sub plugin_enable {
	my $self = shift;

	# Read the plugin configuration, and
	my $config = $self->config_read;
	unless ( defined $config ) {

		# No configuration, let us create it
		$config = {};
	}

	# Make sure defaults are respected if they are undefined.
	unless ( defined $config->{type} ) {
		$config->{type} = 'Moose';
	}
	unless ( defined $config->{feature_snippets} ) {
		$config->{feature_snippets} = 'Moose';
	}

	# Write the plugin's configuration
	$self->config_write($config);

	# Update configuration attribute
	$self->{config} = $config;

	# Generate missing Padre's events
	# TODO remove once Padre 0.96 is released
	require Padre::Plugin::Snippet::Role::NeedsPluginEvent;
	Padre::Plugin::Snippet::Role::NeedsPluginEvent->meta->apply( $self->main );

	# Highlight the current editor. This is needed when a plugin is enabled
	# for the first time
	$self->editor_changed;

	return 1;
}

# Called when the plugin is disabled by Padre
sub plugin_disable {
	my $self = shift;

	# TODO: Switch to Padre::Unload once Padre 0.96 is released
	for my $package (CHILDREN) {
		require Padre::Unload;
		Padre::Unload->unload($package);
	}
}

# # Called when Padre wants to display plugin menu items
# sub menu_plugins {
# my $self      = shift;
# my $main      = $self->main;
# my $menu_item = Wx::MenuItem->new( undef, -1, Wx::gettext('Snippet') . "...\tF9", );

# Wx::Event::EVT_MENU(
# $main,
# $menu_item,
# sub {
# },
# );

# return $menu_item;
# }

sub editor_changed {
	my $self     = shift;
	my $document = $self->current->document or return;
	my $editor   = $self->current->editor or return;

	# Always cleanup current document
	if ( defined $self->{document} ) {
		$self->{document}->cleanup;
		$self->{document} = undef;
	}

	# Only on Perl documents
	return unless $document->isa('Padre::Document::Perl');

	# Create a new snippet document
	require Padre::Plugin::Snippet::Document;
	$self->{document} = Padre::Plugin::Snippet::Document->new(
		editor   => $editor,
		document => $document,
		config   => $self->{config},
	);

	return;
}

1;

__END__

=pod

=head1 NAME

Padre::Plugin::Snippet - TextMate-like snippets for Padre

=head1 SYNOPSIS

    cpan Padre::Plugin::Snippet

Then use it via L<Padre>, The Perl IDE.

=head1 DESCRIPTION

Once you enable this Plugin under Padre, you'll get TextMate-style TAB triggered
snippets for the following:

=item Perl

=item Moose

=item Mouse

=item MooseX::Declare

=back

=head1 BUGS

Please report any bugs or feature requests to C<bug-padre-plugin-snippet at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Padre-Plugin-Snippet>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Padre::Plugin::Snippet

You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Padre-Plugin-Snippet>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Padre-Plugin-Snippet>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Padre-Plugin-Snippet>

=item * Search CPAN

L<http://search.cpan.org/dist/Padre-Plugin-Snippet/>

=back

=head1 SEE ALSO

L<Padre>

=head1 AUTHORS

Ahmad M. Zawawi <ahmad.zawawi@gmail.com>

=head1 CONTRIBUTORS

Adam Kennedy <adamk@cpan.org>

Kevin Dawson E<lt>bowtie@cpan.orgE<gt>


=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Ahmad M. Zawawi

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut