[Jifty-commit] r6712 - in jifty/trunk/lib/Jifty: .

Jifty commits jifty-commit at lists.jifty.org
Mon Mar 30 17:37:34 EDT 2009


Author: alexmv
Date: Mon Mar 30 17:37:33 2009
New Revision: 6712

Modified:
   jifty/trunk/lib/Jifty/ClassLoader.pm
   jifty/trunk/lib/Jifty/Script/Action.pm

Log:
AppClass::Action is now a mixin, and does not inherit from Jifty::Action

This removes a diamond inheritance pattern from autogenerated jifty
actions, and those made by `./bin/jifty action`.  This is additionally
needed in order to allow `jifty action`-generated UpdateWidget actions
to inherit from a consistent and correct set of parents.

*** NOTE: This _will_ break existing actions which only inherit from
    YourApp::Action and not Jifty::Action as well.

Modified: jifty/trunk/lib/Jifty/ClassLoader.pm
==============================================================================
--- jifty/trunk/lib/Jifty/ClassLoader.pm	(original)
+++ jifty/trunk/lib/Jifty/ClassLoader.pm	Mon Mar 30 17:37:33 2009
@@ -70,7 +70,8 @@
 
 =item I<Application>::Action
 
-An empty class that descends from L<Jifty::Action>.
+An empty mixin class for all actions in your application.  Should
+B<not> inherit from L<Jifty::Action>.
 
 =item I<Application>::Action::I<[Verb]>I<[Something]>
 
@@ -177,14 +178,22 @@
     # Handle most of the standard App::Class ISA Jifty::Class
     elsif ( $module =~ /^(?:$base)::(Record|Collection|Notification|
                                       Dispatcher|Bootstrap|Upgrade|CurrentUser|
-                                      Handle|Event|Event::Model|Action|
+                                      Handle|Event|Event::Model|
                                       Action::Record::\w+)$/x ) {
         $AUTOGENERATED{$module} = 1;
         return $self->return_class(
                   "package $module;\n"
                 . "use base qw/Jifty::$1/; \n"
             );
-    } 
+    }
+
+    # Autogenerate empty Action mixin
+    elsif ( $module =~ /^(?:$base)::Action$/) {
+        $AUTOGENERATED{$module} = 1;
+        return $self->return_class(
+            "package $module;\n"
+        );
+    }
     
     # Autogenerate an empty View if none is defined
     elsif ( $module =~ /^(?:$base)::View$/ ) {

Modified: jifty/trunk/lib/Jifty/Script/Action.pm
==============================================================================
--- jifty/trunk/lib/Jifty/Script/Action.pm	(original)
+++ jifty/trunk/lib/Jifty/Script/Action.pm	Mon Mar 30 17:37:33 2009
@@ -78,7 +78,16 @@
     Jifty->new( no_handle => 1 );
     my $root = Jifty::Util->app_root;
     my $appclass = Jifty->config->framework("ApplicationClass");
-    my $appclass_path =  File::Spec->catfile(split(/::/,Jifty->config->framework("ApplicationClass")));
+    my $appclass_path =  File::Spec->catfile(split(/::/,$appclass));
+
+    # Detect if they're creating an App::Action::UpdateWidget, for example
+    my $subclass = "Jifty::Action";
+    if ($action =~ /^(Create|Search|Execute|Update|Delete)(.+)$/) {
+        my($type, $model) = ($1, $2);
+        $model = Jifty->app_class( Model => $model );
+        $subclass = Jifty->app_class( Action => Record => $type )
+            if grep {$_ eq $model} Jifty->class_loader->models;
+    }
 
     my $actionFile = <<"EOT";
 use strict;
@@ -91,7 +100,7 @@
 =cut
 
 package @{[$appclass]}::Action::@{[$action]};
-use base qw/@{[$appclass]}::Action Jifty::Action/;
+use base qw/@{[$appclass]}::Action @{[$subclass]}/;
 
 use Jifty::Param::Schema;
 use Jifty::Action schema {


More information about the Jifty-commit mailing list