Guten Tag,
ich möchte gerne ein DBIx::Class-Objekt mit einer eigenen Klasse "dekorieren" (s.a.
http://de.wikipedia.org/wiki/Dekorierer). Dazu habe ich mir überlegt, dass ich der Dekorierer-Klasse eine Referenz auf das zu dekorierende Objekt übergebe und speichere. Bei einem Methoden-Aufruf ermittle ich per AUTOLOADER, welche Methode aufgerufen wird. Diese soll aufgerufen werden - und dann bei bestimmten Aktionen noch weitere Aktionen durchführen.
1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use MyModels::Main::Result::User;
use DecoratorHistory;
my $prj = new MyModels::Main::Result::User( ... );
$prj = new DecoratorHistory($prj);
my $p = $prj->search( {project_id => 12 } , {} )->single();
Hier noch mein Dekorierer-Modul:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package DecoratorHistory;
use strict;
use vars '$AUTOLOAD';
sub new {
my ($class, @args) = @_;
my $self = bless {}, ref($class) || $class;
$self->_init(@args);
return $self;
}
sub _init {
my ($self, @args) = @_;
$self->{_object} = shift @args;
}
sub AUTOLOAD {
my ($self, @args) = @_;
my $function = $AUTOLOAD;
$function =~ s/^(.*::)//;
return if ($function eq 'DESTROY');
my $o = "$self->{_object}->$function";
my $r = $o->( @args );
if ($function eq 'update') {
}
return $r;
}
1;
... nur klappt aber leider nicht der "durchgeleitete" Aufruf der Methode der zu dekorierenden Klasse. "Klar..." werden viell. einige von Euch sagen - dann könnt Ihr mir vielleicht einen Tip geben?? ;-)
Ich habe nun schon viel ausprobiert und im Netz gesucht - aber komme nicht weiter.
Viele Grüße, Peter
Last edited: 2012-01-27 18:35:24 +0100 (CET)