From 0e5e350124f7eec8f67109fe4777bc2dae6c0ea6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sven=20Sch=C3=B6ling?= Date: Tue, 19 Dec 2017 15:23:35 +0100 Subject: [PATCH] =?utf8?q?Presenter:=20Sub-Presenter=20auf=20Funktional=20?= =?utf8?q?ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 1. alle Sub-Presenter aus dem SL::Presenter Namespace geschmissen 2. Keine ungefragten @EXPORTs mehr, nur noch @EXPORT_OK 3. Alle Methoden sind auf Funktionen umgeschrieben (kein $self mehr) 4. Die benötigten Methoden von Sub-Presentern müssen jetzt direkt importiert werden (betrifft vor allem SL::Presenter::EscapedText und SL::Presenter::Tag) 5. Da die Funktionen in Tag/Text/EscapedText recht häufig gebraucht werden, exportieren die ihre Funktionen stattdessen nach SL::Presenter::Simple, und die Proxies in SL::Template::Plugin::L und SL::Template::Plugin::P dispatchen auf diesen Namespace statt auf SL::Presenter. 6. Die Sub-Namespaces sind in SL::Presenter::ALL registriert, und dort liegt auch der Proxymechanismus um vom Objekt aus zu der Funktion zu dispatchen. Das ist nur in SL::Template::Plugin::P registriert, nicht mehr in L. 7. Für Funktionen deren exportierter name mit Namespace präfixt war, gibt es einen Alias angelegt der nicht exportiert wird. --- SL/DB/Helper/Presenter.pm | 4 +- SL/Presenter.pm | 84 ++--------- SL/Presenter/ALL.pm | 70 +++++++++ SL/Presenter/BankAccount.pm | 12 +- SL/Presenter/Chart.pm | 30 ++-- SL/Presenter/CustomerVendor.pm | 42 +++--- SL/Presenter/DeliveryOrder.pm | 24 ++-- SL/Presenter/EscapedText.pm | 59 +++++++- SL/Presenter/GL.pm | 15 +- SL/Presenter/Invoice.pm | 49 +++---- SL/Presenter/Letter.pm | 14 +- SL/Presenter/Order.pm | 37 ++--- SL/Presenter/Part.pm | 43 +++--- SL/Presenter/Project.pm | 29 ++-- SL/Presenter/Record.pm | 175 ++++++++++++----------- SL/Presenter/RequirementSpec.pm | 13 +- SL/Presenter/RequirementSpecItem.pm | 22 +-- SL/Presenter/RequirementSpecTextBlock.pm | 8 +- SL/Presenter/SepaExport.pm | 12 +- SL/Presenter/ShopOrder.pm | 13 +- SL/Presenter/Simple.pm | 10 ++ SL/Presenter/Tag.pm | 84 +++++------ SL/Presenter/Text.pm | 17 +-- SL/Template/Plugin/L.pm | 20 +-- SL/Template/Plugin/P.pm | 25 ++-- 25 files changed, 512 insertions(+), 399 deletions(-) create mode 100644 SL/Presenter/ALL.pm create mode 100644 SL/Presenter/Simple.pm diff --git a/SL/DB/Helper/Presenter.pm b/SL/DB/Helper/Presenter.pm index 240d18ff2..9c9f8a25d 100644 --- a/SL/DB/Helper/Presenter.pm +++ b/SL/DB/Helper/Presenter.pm @@ -17,7 +17,9 @@ sub AUTOLOAD { return if $method eq 'DESTROY'; - return $self->[0]->$method($self->[1], @args); + if (my $sub = $self->[0]->can($method)) { + return $sub->($self->[1], @args); + } } 1; diff --git a/SL/Presenter.pm b/SL/Presenter.pm index cd4f4e17e..b3191750c 100644 --- a/SL/Presenter.pm +++ b/SL/Presenter.pm @@ -7,25 +7,7 @@ use parent qw(Rose::Object); use Carp; use Template; -use SL::Presenter::Chart; -use SL::Presenter::CustomerVendor; -use SL::Presenter::DeliveryOrder; -use SL::Presenter::EscapedText; -use SL::Presenter::Invoice; -use SL::Presenter::GL; -use SL::Presenter::Letter; -use SL::Presenter::Order; -use SL::Presenter::Part; -use SL::Presenter::Project; -use SL::Presenter::Record; -use SL::Presenter::RequirementSpec; -use SL::Presenter::RequirementSpecItem; -use SL::Presenter::RequirementSpecTextBlock; -use SL::Presenter::SepaExport; -use SL::Presenter::ShopOrder; -use SL::Presenter::Text; -use SL::Presenter::Tag; -use SL::Presenter::BankAccount; +use SL::Presenter::EscapedText qw(is_escaped); use Rose::Object::MakeMethods::Generic ( scalar => [ qw(need_reinit_widgets) ], @@ -80,15 +62,15 @@ sub render { if (!$options->{process}) { # If $template is a reference then don't try to read a file. my $ref = ref $template; - return $template if $ref eq 'SL::Presenter::EscapedText'; - return SL::Presenter::EscapedText->new(text => ${ $template }, is_escaped => 1) if $ref eq 'SCALAR'; + return $template if $ref eq 'SL::Presenter::EscapedText'; + return is_escaped(${ $template }) if $ref eq 'SCALAR'; # Otherwise return the file's content. my $file = IO::File->new($source, "r") || croak("Template file ${source} could not be read"); my $content = do { local $/ = ''; <$file> }; $file->close; - return SL::Presenter::EscapedText->new(text => $content, is_escaped => 1); + return is_escaped($content); } # Processing was requested. Set up all variables. @@ -108,7 +90,7 @@ sub render { my $parser = $self->get_template; $parser->process($source, \%params, \$output) || croak $parser->error; - return SL::Presenter::EscapedText->new(text => $output, is_escaped => 1); + return is_escaped($output); } sub get_template { @@ -132,28 +114,6 @@ sub get_template { return $self->{template}; } -sub escape { - my ($self, $text) = @_; - - return SL::Presenter::EscapedText->new(text => $text); -} - -sub escaped_text { - my ($self, $text) = @_; - - return SL::Presenter::EscapedText->new(text => $text, is_escaped => 1); -} - -sub escape_js { - my ($self, $text) = @_; - - $text =~ s|\\|\\\\|g; - $text =~ s|\"|\\\"|g; - $text =~ s|\n|\\n|g; - - return SL::Presenter::EscapedText->new(text => $text, is_escaped => 1); -} - 1; __END__ @@ -176,14 +136,15 @@ SL::Presenter - presentation layer class # Higher-level rendering of certain objects: use SL::DB::Customer; - my $linked_customer_name = $presenter->customer($customer, display => 'table-cell'); + my $linked_customer_name = $customer->presenter->customer(display => 'table-cell'); # Render a list of links to sales/purchase records: use SL::DB::Order; + use SL::Presenter::Record qw(grouped_record_list); my $quotation = SL::DB::Manager::Order->get_first(where => { quotation => 1 }); my $records = $quotation->linked_records(direction => 'to'); - my $html = $presenter->grouped_record_list($records); + my $html = grouped_record_list($records); =head1 CLASS FUNCTIONS @@ -309,35 +270,6 @@ it at all: { type => 'json', process => 0 } ); -=item C - -Returns an HTML-escaped version of C<$text>. Instead of a string an -instance of the thin proxy-object L is -returned. - -It is safe to call C on an instance of -L. This is a no-op (the same instance will -be returned). - -=item C - -Returns an instance of L. C<$text> is -assumed to be a string that has already been HTML-escaped. - -It is safe to call C on an instance of -L. This is a no-op (the same instance will -be returned). - -=item C - -Returns a JavaScript-escaped version of C<$text>. Instead of a string -an instance of the thin proxy-object L is -returned. - -It is safe to call C on an instance of -L. This is a no-op (the same instance will -be returned). - =item C Returns the global instance of L