(pre|post)load_dispatch_types patch from kane
Matt S Trout [Thu, 23 Feb 2006 14:38:41 +0000 (14:38 +0000)]
lib/Catalyst/Dispatcher.pm

index 858c1ec..855226a 100644 (file)
@@ -17,7 +17,9 @@ use overload '""' => sub { return ref shift }, fallback => 1;
 
 __PACKAGE__->mk_accessors(
     qw/tree dispatch_types registered_dispatch_types
-      method_action_class action_container_class/
+      method_action_class action_container_class
+      preload_dispatch_types postload_dispatch_types
+    /
 );
 
 # Preload these action types
@@ -38,6 +40,40 @@ See L<Catalyst>.
 
 =head1 METHODS
 
+=cut
+
+sub new {
+    my $self = shift;
+    my $class = ref($self) || $self;
+                                    
+    my $obj = $class->SUPER::new( @_ );
+                                       
+    # set the default pre- and and postloads
+    $obj->preload_dispatch_types(  \@PRELOAD );        
+    $obj->postload_dispatch_types( \@POSTLOAD );
+    return $obj;                        
+}
+
+=head2 $self->preload_dispatch_types
+
+An arrayref of pre-loaded dispatchtype classes
+
+Entries are considered to be available as C<Catalyst::DispatchType::CLASS>
+To use a custom class outside the regular C<Catalyst> namespace, prefix
+it with a C<+>, like so:
+
+    +My::Dispatch::Type
+
+=head2 $self->postload_dispatch_types
+
+An arrayref of post-loaded dispatchtype classes
+
+Entries are considered to be available as C<Catalyst::DispatchType::CLASS>
+To use a custom class outside the regular C<Catalyst> namespace, prefix
+it with a C<+>, like so:
+
+    +My::Dispatch::Type
+
 =head2 $self->detach( $c, $command [, \@arguments ] )
 
 =cut
@@ -355,8 +391,8 @@ sub setup_actions {
     $self->action_container_class('Catalyst::ActionContainer');
 
     # Preload action types
-    for my $type (@PRELOAD) {
-        my $class = "Catalyst::DispatchType::$type";
+    for my $type ( @{$self->preload_dispatch_types} ) {
+        my $class = ($type =~ /^\+(.*)$/) ? $1 : "Catalyst::DispatchType::${type}";
         eval "require $class";
         Catalyst::Exception->throw( message => qq/Couldn't load "$class"/ )
           if $@;
@@ -374,8 +410,8 @@ sub setup_actions {
     }
 
     # Postload action types
-    for my $type (@POSTLOAD) {
-        my $class = "Catalyst::DispatchType::$type";
+    for my $type ( @{$self->postload_dispatch_types} ) {
+        my $class = ($type =~ /^\+(.*)$/) ? $1 : "Catalyst::DispatchType::${type}";
         eval "require $class";
         Catalyst::Exception->throw( message => qq/Couldn't load "$class"/ )
           if $@;