package Catalyst::View::SVGTTGraph;

use strict;
use warnings;
use base qw(Catalyst::View);
use NEXT;

my($Revision) = '$Id: SVGTTGraph.pm,v 1.1.1.1 2006/02/11 17:54:15 takayama Exp $';

our $VERSION = '0.011';

use Data::Dumper;

=head1 NAME

Catalyst::View::SVGTTGraph - SVG Graph View Component for Catalyst

=head1 SYNOPSIS

in your View.

  package MyApp::View::SVGTTGraph;
  use base 'Catalyst::View::SVGTTGraph';

in your controller.

  sub pie_graph : Local {
      my @fields = qw(Jan Feb Mar);
      my @data_sales_02 = qw(12 45 21);

      $c->svgttg->create('Pie',
                         {'height' => '500',
                          'width' => '300',
                          'fields' => \@fields,
                         });
      $c->svgttg->graph_obj->add_data({
                                       'data' => \@data_sales_02,
                                       'title' => 'Sales 2002',
                                      });
  }

  sub end : Private {
      my ( $self, $c ) = @_;
      $c->forward('Catalyst::View::SVGTTGraph');
  }

and see L<SVG::TT::Graph>.

=head1 DESCRIPTION

Catalyst::View::SVGTTGraph is Catalyst view handler of SVG::TT::Graph.

=cut

=head1 METHODS

=head2 new

this method makes method named $c->svgttg.
$c->svgttg is an accessor to the object of Catalyst::View::SVGTTGraphObj.
$c->svgttg uses $c->stash->{'Catalyst::View::SVGTTGraph'}.

=cut

sub new {
    my $class = shift;
    my $c = shift;
    my $self = $class->NEXT::new($c, @_);
    {
	no strict 'refs';
	my $accessor = sub {
	    my $c = shift;
	    $c->stash->{'Catalyst::View::SVGTTGraph'} = Catalyst::View::SVGTTGraphObj->new()
		unless($c->stash->{'Catalyst::View::SVGTTGraph'});
	    return $c->stash->{'Catalyst::View::SVGTTGraph'};
	};
	*{"${c}::svgttg"} = $accessor;
	*{"${c}::_svgttg_accessor"} = $accessor;
    }
    return $self
}

=head2 process

create SVG Graph

=cut

sub process {
    my $self = shift;
    my $c = shift;
    
    die "Catalyst::View::SVGTTGraph : graph object is undefined !"
	unless($c->svgttg->graph_obj);
#    $c->log->debug(Dumper($c->view_svggraph));
    $c->res->header('Content-Type' => 'image/svg+xml');
    $c->res->body($c->svgttg->burn);
    return 1;
}

1;


package Catalyst::View::SVGTTGraphObj;

use strict;
use base 'Class::Accessor::Fast';


sub new {
    my $pkg = shift;
    my $c = shift;
    my $this = bless({}, $pkg);
    $this->mk_accessors(qw(graph_obj _c));
    $this->graph_obj(undef);
    $this->_c($c);
    return $this;
}

=head2 $c->svgttg->create

The object of new SVG::TT::Graph is made.
Please input the kind of the graph to the first argument.
Thereafter, it comes to be able to use $c->svgttg->graph_obj.

  $c->svgttg->create('Bar');
or
  $c->svgttg->create('Bar', {'height' => '500', 'width' => '300', 'fields' => \@fields});

=cut

sub create {
    my $this = shift;
    my $type = shift;
    
    my $opt = shift;

    my $graph_pkg = "SVG::TT::Graph::$type";
    eval("use $graph_pkg;");
    die "Catalyst::View::SVGTTGraph : use error !\n$@"
	if($@);
    $this->graph_obj($graph_pkg->new($opt));
}

=head2 $c->svgttg->graph_obj

It accesses the object of SVG::TT::Graph.
Please use it after calling $c->svgttg->create.

  $c->svgttg->graph_obj->add_data(....);
  $c->svgttg->graph_obj->add_data(....);

=head2 $c->svgttg->burn

throws to SVG::TT::Graph->burn

  $c->svgttg->burn;

=cut

sub burn {
    my $this = shift;
    return $this->graph_obj->burn;
}

=head2 $c->svgttg->clear

clear $c->stash->{'Catalyst::View::SVGTTGraph'}

=cut

sub clear {
    my $this = shift;
    $this->_c->stash->{'Catalyst::View::SVGTTGraph'} = undef;
}

=head1 SEE ALSO

L<Catalyst>, L<SVG::TT::Graph>

=head1 AUTHOR

Shota Takayama, C<shot[atmark]bindstorm.jp>

=head1 COPYRIGHT AND LICENSE

Copyright (c) Shanon, Inc. All Rights Reserved. L<http://www.shanon.co.jp/>

This program is free software, you can redistribute it and/or modify it under
the same terms as Perl itself.

=cut

1;