[tpm] Is it possible to get a $coderef to an object method?

Sean Meisner sdmeisner at yahoo.com
Fri Oct 5 14:18:59 PDT 2007


The "DUMMY" string is actually coming from
Data::Dumper.  It won't show coderefs by default.  Try
setting the Deparse flag for Data::Dumper.

Cheers,

Sean


--- Scott Elcomb <psema4 at gmail.com> wrote:

> Hi all,
> 
> I'd like to create a very lightweight MVC
> architecture using plugins.
> I'm not sure if I'm barking up the right tree with
> this, but aside
> from one issue it seems the idea should be doable.
> 
> I've looked at Maypole and Catalyst, but they have
> far too many
> dependencies for my clients' tastes.  What I'm
> trying to do with the
> "mvcplugs" POC is dead simple: drop a plugin object
> (containing a
> combination of model/view/controller methods) into
> the plugin
> directory ("MVCPlugs") and have it automatically
> load/register when
> the main script ("mvcplugs.pl") runs.
> 
> Currently this doesn't do much beyond
> loading/registering an explicit
> list of plugins.  The problem shows up when I try to
> register the
> model/view/controller method coderefs in %registry. 
> In the output
> sample (bottom of post) the coderefs showup as
> "DUMMY" subs.
> 
> Is there a way to get valid coderefs or am I headed
> in the wrong direction?
> 
> Thanks in advance,
> - Scott.
> 
> 
> #// START OF mvcplugs.pl //#
> #!/usr/bin/perl
> 
> use strict;
> use Data::Dumper;
> 
> ###################################################
> # CONFIG (Should read in from file or CLI args)
> #
> my @plugins = qw[Core PluginTemplate TestPlugin];
> my $verbose = 1;
> ###################################################
> 
> my %registry = (
>                  'plugins' => {},
>                  'models' => {},
>                  'views' => {},
>                  'controllers' => {}
>                );
> 
> foreach my $n (@plugins) {
>   my $instantiatePlugin = "use MVCPlugs::$n; return
> MVCPlugs::$n" . '->new()';
>   my $plugin = eval($instantiatePlugin);
>   my $name = $plugin->name($n);
> 
>   %registry->{'plugins'}->{$name} = $plugin;
> 
>   if ($verbose) {
>     print "[mvcplugs.pl] Plugin Instantiation
> String: $instantiatePlugin\n";
>     print "[mvcplugs.pl] Plugin Instantiaion:
> $plugin\n";
>   }
> 
>   if (
>
%registry->{'plugins'}->{$name}->initPlugin(\%registry)
> ) {
>     print qq[Plugin $name initialized.\n];
>   } else {
>     print qq[Plugin $name initialization failed!\n];
>   }
> 
> }
> 
> if ($verbose) {
>   print "\n[mvcplugs.pl] Dumping Registry:\n" .
> Dumper(%registry) . "\n\n";
> }
> #// END OF mvcplugs.pl //#
> 
> 
> 
> #// START OF MVCPlugs/TestPlugin.pm //#
> package MVCPlugs::TestPlugin;
> use strict;
> no strict 'refs';
> use Data::Dumper;
> 
> sub new {
>   my $self = {};
>   $self->{'NAME'} = 'TEST_PLUGIN';
>   bless($self);
>   return $self;
> }
> 
> sub name {
>   my $self = shift;
>   if (@_) { $self->{'NAME'} = shift }
>   return $self->{'NAME'};
> }
> 
> sub registry {
>   my $self = shift;
>   if (@_) { $self->{'REGISTRY'} = shift }
>   return $self->{'REGISTRY'};
> }
> 
> sub initPlugin {
>   my $self = shift;
>   my $registryref = shift;
> 
>   ######################
>   # This block and the associated "coderefTest"
> methods are the only
>   # differences from the Core.pm & PluginTemplate.pm
> sample plugins
>   #
>   # register a model, view, and controller
>   $registryref->{'models'}->{'TestModel'} =
> \&coderefTest1;
>   $registryref->{'views'}->{'TestView'} = sub { my
> $self = shift;
> $self->coderefTest2(); };
>   $registryref->{'controllers'}->{'TestController'}
> = \&coderefTest3;
>   ######################
> 
>   return 1;
> }
> 
> sub coderefTest1 {
>   my $self = shift;
>   return 'coderefTest1: call success!';
> }
> 
> sub coderefTest2 {
>   my $self = shift;
>   return 'coderefTest2: call success!';
> }
> 
> sub coderefTest3 {
>   my $self = shift;
>   return 'coderefTest3: call success!';
> }
> 
> 1;
> #// END OF MVCPlugs/TestPlugin.pm //#
> 
> 
> #// START OF Sample Output (VERBOSE=1)//#
> [mvcplugs.pl] Plugin Instantiation String: use
> MVCPlugs::Core; return
> MVCPlugs::Core->new()
> [mvcplugs.pl] Plugin Instantiaion:
> MVCPlugs::Core=HASH(0x81d77e0)
> Plugin Core initialized.
> [mvcplugs.pl] Plugin Instantiation String: use
> MVCPlugs::PluginTemplate; return
> MVCPlugs::PluginTemplate->new()
> [mvcplugs.pl] Plugin Instantiaion:
> MVCPlugs::PluginTemplate=HASH(0x81d77f8)
> Plugin PluginTemplate initialized.
> [mvcplugs.pl] Plugin Instantiation String: use
> MVCPlugs::TestPlugin;
> return MVCPlugs::TestPlugin->new()
> [mvcplugs.pl] Plugin Instantiaion:
> MVCPlugs::TestPlugin=HASH(0x81d7810)
> Plugin TestPlugin initialized.
> 
> [mvcplugs.pl] Dumping Registry:
> $VAR1 = 'models';
> $VAR2 = {
>           'TestModel' => sub { "DUMMY" }
>         };
> $VAR3 = 'controllers';
> $VAR4 = {
>           'TestController' => sub { "DUMMY" }
>         };
> $VAR5 = 'views';
> $VAR6 = {
>           'TestView' => sub { "DUMMY" }
>         };
> $VAR7 = 'plugins';
> $VAR8 = {
>           'PluginTemplate' => bless( {
>                                        'NAME' =>
> 'PluginTemplate'
>                                      },
> 'MVCPlugs::PluginTemplate' ),
>           'TestPlugin' => bless( {
>                                    'NAME' =>
> 'TestPlugin'
>                                  },
> 'MVCPlugs::TestPlugin' ),
> 
=== message truncated ===



More information about the toronto-pm mailing list