The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Padre::Plugin::XS::Document;
BEGIN {
  $Padre::Plugin::XS::Document::VERSION = '0.09';
}

# ABSTRACT: Padre XS Document

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

our @ISA = 'Padre::Document';

# TODO better highlighting. Can vim do better? Can we steal? Add an STC highlighter? ...

sub keywords {
	my $self = shift;

	if ( not defined $self->{_perlapi_keywords} ) {
		$self->_load_perlapi_keywords();
	}
	return $self->{_perlapi_keywords};
}


# This loads the perlapi keywords for calltips
# It first tries to use the Perl::APIReference module which has perlapi references
# for many, many releases of perl. It fetches the desired perlapi version from the
# project configuration and uses the newest if not configured. Then, it asks the
# Perl::APIReference for the index of keywords. Since this can fail at various levels,
# we fall back to reading the perlapi keywords from an included YAML file if necessary
# --Steffen
sub _load_perlapi_keywords {
	my $self = shift;

	if ( not eval "use Perl::APIReference 0.03; 1;" ) {
		$self->{_perlapi_keywords} =
			YAML::Tiny::LoadFile( Padre::Util::sharefile( 'languages', 'perl5', 'perlapi_current.yml' ) );
		return;
	}

	my $perl_version = $self->{_perlapi_version};

	if ( not defined $perl_version ) {
		my $project = $self->project;
		if ( defined $project ) {
			$perl_version = 'newest';
			my $cfg = $project->config;
			$perl_version = $cfg->xs_calltips_perlapi_version();
		} else {
			$perl_version = Padre->ide->config->xs_calltips_perlapi_version();
		}
		$self->{_perlapi_version} = $perl_version;
	}

	my $apiref = eval { Perl::APIReference->new( perl_version => $perl_version ) };
	if ( not $apiref ) {

		# fallback...
		$self->{_perlapi_keywords} =
			YAML::Tiny::LoadFile( Padre::Util::sharefile( 'languages', 'perl5', 'perlapi_current.yml' ) );
		return;
	}

	# TODO: Perl::APIReference also provides an "index" method, but that doesn't return the structure
	#       in exactly the way we want it. Easy way out: Add an accessor to Perl::APIReference that
	#       returns an API structure akin to what would be returned by loading the YAML.
	require YAML::Tiny;
	$self->{_perlapi_keywords} = YAML::Tiny::Load( $apiref->as_yaml_calltips );
	return;
}

1;



=pod

=head1 NAME

Padre::Plugin::XS::Document - Padre XS Document

=head1 VERSION

version 0.09

=head1 AUTHORS

=over 4

=item *

Steffen Mueller <smueller@cpan.org>

=item *

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

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2010 by Steffen Mueller.

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


__END__