package OAuth::Lite2::Formatters;

use strict;
use warnings;

use OAuth::Lite2::Formatter::JSON;
use OAuth::Lite2::Formatter::XML;
use OAuth::Lite2::Formatter::FormURLEncoded;
use OAuth::Lite2::Formatter::Text;

my %FORMATTERS_BY_TYPE;
my %FORMATTERS_BY_NAME;

sub add_formatter {
    my ($class, $formatter) = @_;
    $FORMATTERS_BY_NAME{$formatter->name} = $formatter;
    $FORMATTERS_BY_TYPE{$formatter->type} = $formatter;
}

__PACKAGE__->add_formatter( OAuth::Lite2::Formatter::JSON->new );
__PACKAGE__->add_formatter( OAuth::Lite2::Formatter::XML->new );
__PACKAGE__->add_formatter( OAuth::Lite2::Formatter::FormURLEncoded->new );
__PACKAGE__->add_formatter( OAuth::Lite2::Formatter::Text->new );

sub get_formatter_by_name {
    my ($class, $name) = @_;
    return unless $name;
    return $FORMATTERS_BY_NAME{$name};
}

sub get_formatter_by_type {
    my ($class, $type) = @_;
    return unless $type;

    # If content-type includes subtype, top-level media type is only used.
    if ($type =~ /;/){
        $type = $`;
    }

    return $FORMATTERS_BY_TYPE{$type};
}

=head1 NAME

OAuth::Lite2::Formatters - OAuth 2.0 formatters store

=head1 SYNOPSIS

    my $formatter = OAuth::Lite2::Formatter->get_formatter_by_name("json");
    my $formatter = OAuth::Lite2::Formatter->get_formatter_by_type("application/json");

    my $obj = $formatter->parse( $string );
    $string = $formatter->format( $obj );

=head1 DESCRIPTION

OAuth 2.0 formatters store.
from draft-v8, specification requires only JSON format.
This library leaves the other formatters for interop.

=head1 METHODS

=head2 get_formatter_by_name( $name )

return formatter by name

=head2 get_formatter_by_type( $content_type )

return formatter by content type

=head1 SEE ALSO

L<OAuth::Lite2::Formatter>
L<OAuth::Lite2::Formatter::JSON>
L<OAuth::Lite2::Formatter::XML>
L<OAuth::Lite2::Formatter::FormURLEncoded>

=head1 AUTHOR

Lyo Kato, E<lt>lyo.kato@gmail.comE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2010 by Lyo Kato

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8 or,
at your option, any later version of Perl 5 you may have available.

=cut

1;