| Rubric documentation | Contained in the Rubric distribution. |
Rubric::Entry::Formatter - a base class for entry body formatters
version 0.147
This class serves as a single point of dispatch for attempts to format entry bodies from their native format into rendered output.
format my $formatted = Rubric::Entry::Formatter->format(\%arg);
This method accepts a set of named arguments and returns formatted output in the requested format. If it is unable to do so, it throws an exception.
Valid arguments are:
markup - the markup format used to mark up the text (default: _default) text - the text that has been marked up and should be formatted (required) format - the requested output format (required)
Formatting requests are dispatched according to the configuration in
markup_formatter.
Writing a formatter should be very simple; the interface is very simple, although it's also very young and so it may change when I figure out the problems in the current implementation.
A formatter must implement an as_FORMAT method for each format to which it
claims to be able to output formatted text. When Rubric::Entry::Formatter
wants to dispatch text for formatting, it will call that method as follows:
my $formatted = Formatter->as_whatever(\%arg);
The arguments in %arg will be the same as those passed to
Rubric::Entry::Formatter.
Actually, the method is found and called via can, so a suitably programmed
module can respond to can to allow it to render into all the format it likes
-- or at least to claim to.
Ricardo SIGNES, <rjbs@cpan.org>
Please report any bugs or feature requests to bug-rubric@rt.cpan.org, or
through the web interface at http://rt.cpan.org. I will be notified, and
then you'll automatically be notified of progress on your bug as I make
changes.
Copyright 2005 Ricardo SIGNES. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Rubric documentation | Contained in the Rubric distribution. |
use strict; use warnings; package Rubric::Entry::Formatter; our $VERSION = '0.147';
use Carp (); use Rubric::Config;
sub _load_formatter { my ($class, $formatter) = @_; return 1 if eval { $formatter->can('as_text'); }; ## no critic (StringyEval) return 1 if eval qq{require $formatter}; ## use critic return 0; } sub _formatter_for { my ($class, $markup) = @_; my $markup_formatter = Rubric::Config->markup_formatter; $markup_formatter->{_default} = 'Rubric::Entry::Formatter::Nil' unless $markup_formatter->{_default}; Carp::croak "no formatter is registered for $markup markup" unless my $formatter = $markup_formatter->{ $markup }; return $formatter; } sub format { my ($class, $arg) = @_; my $config = {}; # extra configuration for formatter code my $formatter = $class->_formatter_for($arg->{markup}); if (ref $formatter) { $config = { %$formatter }; Carp::croak "formatter config for $arg->{markup} includes no class" unless $formatter = delete $config->{class}; } $class->_load_formatter($formatter) or Carp::croak "couldn't load formatter '$formatter': $@"; my $formatter_code = $formatter->can("as_$arg->{format}") or Carp::croak "$formatter does not implement formatting to $arg->{format}"; $formatter_code->($formatter, $arg, $config); }
1;