1 package SL::DB::Helper::Presenter;
 
   6   # lightweight: 0: class, 1: object
 
   7   bless [ $_[1], $_[2] ], $_[0];
 
  13   my ($self, @args) = @_;
 
  15   my $method = $AUTOLOAD;
 
  18   return if $method eq 'DESTROY';
 
  20   eval "require $self->[0]";
 
  22   splice @args, -1, 1, %{ $args[-1] } if @args && (ref($args[-1]) eq 'HASH');
 
  24   if (my $sub = $self->[0]->can($method)) {
 
  25     return $sub->($self->[1], @args);
 
  30   my ($self, $method) = @_;
 
  31   eval "require $self->[0]";
 
  32   $self->[0]->can($method);
 
  43 SL::DB::Helper::Presenter - proxy class to allow models to access presenters
 
  47   # assuming SL::Presenter::Part exists
 
  48   # and contains a sub link_to($class, $object) {}
 
  49   SL::DB::Part->new(%args)->presenter->link_to
 
  53 When coding controllers one often encounters objects that are not crucial to
 
  54 the current task, but must be presented in some form to the user. Instead of
 
  55 recreating that all the time the C<SL::Presenter> namepace was introduced to
 
  58 Unfortunately the Presenter code is designed to be stateless and thus acts _on_
 
  59 objects, but can't be instanced or wrapped. The early band-aid to that was to
 
  60 export all sub-presenter calls into the main presenter namespace. Fixing it
 
  61 would have meant accessing presenter functions like this:
 
  63   SL::Presenter::Object->method($object, %additional_args)
 
  65 which is extremely inconvenient.
 
  67 This glue code allows C<SL::DB::Object> instances to access routines in their
 
  68 presenter without additional boilerplate. C<SL::DB::Object> contains a
 
  69 C<presenter> call for all objects, which will return an instance of this proxy
 
  70 class. All calls on this will then be forwarded to the appropriate presenter.
 
  72 =head1 INTERNAL STRUCTURE
 
  74 The created proxy objects are lightweight blessed arrayrefs instead of the
 
  75 usual blessed hashrefs. They only store two elements:
 
  79 =item * The presenter class
 
  81 =item * The invocing object
 
  85 Further delegation is done with C<AUTOLOAD>.
 
  93 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>