[Catalyst-commits] r13453 - in
Catalyst-Runtime/5.80/branches/forward-comp-obj: . lib
lib/Catalyst lib/Catalyst/Engine lib/Catalyst/Script t
t/aggregate t/lib t/lib/TestApp/Controller/Moose
t0m at dev.catalyst.perl.org
t0m at dev.catalyst.perl.org
Wed Jul 28 23:05:09 GMT 2010
Author: t0m
Date: 2010-07-29 00:05:08 +0100 (Thu, 29 Jul 2010)
New Revision: 13453
Added:
Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_ctx_attr.t
Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp/Controller/Moose/NoAttributes.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/t/unit_core_methodattributes_method_metaclass_on_subclasses.t
Modified:
Catalyst-Runtime/5.80/branches/forward-comp-obj/
Catalyst-Runtime/5.80/branches/forward-comp-obj/Changes
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Component.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Controller.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine/CGI.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Runtime.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Create.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Server.pm
Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/live_component_controller_args.t
Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_engine_cgi-prepare_path.t
Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp.pm
Log:
r15535 at spaceinvaders (orig r13239): ribasushi | 2010-05-12 12:48:40 +0100
Better stats API explanation (SpiceMan)
r15559 at spaceinvaders (orig r13263): t0m | 2010-05-15 10:42:58 +0100
r13208 at spaceinvaders (orig r13172): t0m | 2010-04-19 09:54:56 +0200
Branch to try and fix the request uri stuff.
r13209 at spaceinvaders (orig r13173): t0m | 2010-04-19 09:58:37 +0200
Just add comments to tests, no functional changes
r13210 at spaceinvaders (orig r13174): t0m | 2010-04-19 09:59:14 +0200
Get it mostly working, except uri_for is still buggered
r15488 at spaceinvaders (orig r13192): t0m | 2010-05-03 00:26:22 +0200
Revert to old behaviour, allow config for new behaviour. Config option name is rubbish, needs fixing
r15532 at spaceinvaders (orig r13236): t0m | 2010-05-09 01:09:01 +0200
I hate this name less. Others may feel differently
r15556 at spaceinvaders (orig r13260): t0m | 2010-05-15 10:52:16 +0200
Simplify madness some more, back to how it looked in the original fix_path_info_decoding branch so that we aren't using dodgy heuristics to determine the path. Alter the prepare_path tests so that they're testing the appropriate config option so that we now have tests for both code paths
r15557 at spaceinvaders (orig r13261): t0m | 2010-05-15 11:20:16 +0200
Add a pile of docs for the new use_request_uri_for_path setting
r15558 at spaceinvaders (orig r13262): t0m | 2010-05-15 11:38:06 +0200
Add recommendation
r15560 at spaceinvaders (orig r13264): t0m | 2010-05-15 10:55:07 +0100
Changelog, bump versions, add new contributor :)
r15567 at spaceinvaders (orig r13271): jhannah | 2010-05-19 23:36:21 +0100
We appear to have a bug where if lazy => 1 isn't set an exception
occurs.
r15575 at spaceinvaders (orig r13279): jhannah | 2010-05-20 20:46:31 +0100
Oops. I should have TODO'd this one. rafl++
r15577 at spaceinvaders (orig r13281): t0m | 2010-05-20 21:31:39 +0100
r13203 at t0mlaptop (orig r13167): t0m | 2010-04-19 02:57:27 +0100
Branch for doys upcoming metaclass compat fixes.
r13204 at t0mlaptop (orig r13168): t0m | 2010-04-19 03:02:36 +0100
Remove the fugly hack to avoid metaclass compat issues now that Moose is fixed
r15584 at spaceinvaders (orig r13282): t0m | 2010-05-20 21:34:34 +0100
Changelog and dep bump for more_metaclass_compat branch merge
r15585 at spaceinvaders (orig r13283): t0m | 2010-05-20 21:35:20 +0100
Back out hunks I accidentally committed
r15598 at spaceinvaders (orig r13296): t0m | 2010-05-22 11:17:18 +0100
Changelog, bump Moose dep
r15599 at spaceinvaders (orig r13297): t0m | 2010-05-22 11:18:14 +0100
r15581 at spaceinvaders: t0m | 2010-05-21 18:11:33 +0100
Mech tests branch
r15582 at spaceinvaders: t0m | 2010-05-21 18:20:01 +0100
Fix --mech as reportedon list as 'create controller 'option' -mechanize fails'
r15583 at spaceinvaders: t0m | 2010-05-21 18:21:18 +0100
Fix missing - in option, options must be --
r15645 at spaceinvaders (orig r13336): t0m | 2010-06-10 10:54:11 +0100
Fix $self vs $class, davewood++
r15660 at spaceinvaders (orig r13351): rainboxx | 2010-06-15 12:53:05 +0100
Applied doc patches that might help to figure out how to receive component's config values.
r15672 at spaceinvaders (orig r13363): jester | 2010-06-22 21:47:45 +0100
Fixed typo
r15674 at spaceinvaders (orig r13365): bricas | 2010-06-24 13:52:20 +0100
add typo fix to Changes
r15689 at spaceinvaders (orig r13380): arcanez | 2010-07-03 01:04:07 +0100
remove extra '
r15716 at spaceinvaders (orig r13407): hobbs | 2010-07-09 10:40:44 +0100
Try harder to make finalize_error encoding-safe.
r15750 at spaceinvaders (orig r13441): t0m | 2010-07-28 22:39:41 +0100
r15666 at spaceinvaders (orig r13357): jnapiorkowski | 2010-06-16 20:12:46 +0100
new branch
r15667 at spaceinvaders (orig r13358): jnapiorkowski | 2010-06-16 20:55:08 +0100
broke out and documented action_class method
r15749 at spaceinvaders (orig r13440): t0m | 2010-07-28 22:39:32 +0100
Changelog
r15755 at spaceinvaders (orig r13446): t0m | 2010-07-28 23:00:14 +0100
r15662 at spaceinvaders (orig r13353): t0m | 2010-06-15 22:15:31 +0100
Branch for rt58057
r15663 at spaceinvaders (orig r13354): t0m | 2010-06-15 22:17:32 +0100
Commit standalone test, test which makes the TestApp blow up and the nasty workaround
r15726 at spaceinvaders (orig r13417): t0m | 2010-07-23 13:29:21 +0100
I know hobbs has a patch to add a load of these, but we should at least add (es)
r15753 at spaceinvaders (orig r13444): t0m | 2010-07-28 22:56:25 +0100
Entirely the wrong branch, idiot. Remove r13417
r15754 at spaceinvaders (orig r13445): t0m | 2010-07-28 23:00:05 +0100
Document the horrible, changelog. I'm going to merge this and fix a real issue as I don't have time to fuck around inside Moose right now and it's been waiting way too long already
r15756 at spaceinvaders (orig r13447): t0m | 2010-07-28 23:26:21 +0100
Fix TODO tests.
r15757 at spaceinvaders (orig r13448): t0m | 2010-07-28 23:26:31 +0100
Whitespace
r15760 at spaceinvaders (orig r13451): t0m | 2010-07-28 23:53:56 +0100
r13095 at spaceinvaders (orig r13059): caelum | 2010-03-22 09:27:45 +0000
branch to fix running under CGI on IIS
r13097 at spaceinvaders (orig r13061): caelum | 2010-03-22 10:40:52 +0000
fix for CGI on IIS
r15759 at spaceinvaders (orig r13450): t0m | 2010-07-28 23:52:15 +0100
Changelog
Property changes on: Catalyst-Runtime/5.80/branches/forward-comp-obj
___________________________________________________________________
Modified: svk:merge
- 1c72fc7c-9ce4-42af-bf25-3bfe470ff1e8:/local/Catalyst/trunk/Catalyst-Runtime:9763
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.70/branches/compres:7999
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.70/branches/context_go:8001
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.70/trunk:8533
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/Catalyst-Test-Updates:8363
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/add_captures_to_visit:9546
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/aggregate_more:11803
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/better_scripts:12074
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/disable_regex_fallback:11456
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/fix_path_info_decoding:12089
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/index_default_fuckage:10646
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/moose:7911
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/namespace_handling_refactor:10655
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/param_filtering:13012
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/uri_encode_captures_andor_args_take2:11811
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/uri_for_utf8:12834
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/trunk:13223
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-ChildOf:4443
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-Runtime-jrockway:5857
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-component-setup:4320
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-docs:4325
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/current/Catalyst-Runtime:5142
4ad37cd2-5fec-0310-835f-b3785c72a374:/trunk/Catalyst:4483
4ad37cd2-5fec-0310-835f-b3785c72a374:/trunk/Catalyst-Runtime:6165
6d45476b-5895-46b8-b13a-8b969fa34c98:/local/Catalyst-Runtime-better_scripts:11331
8a9521aa-ff93-41d6-9f87-b05cafcdab40:/local/cat/Catalyst-Runtime/5.80/trunk:8157
d7608cd0-831c-0410-93c0-e5b306c3c028:/local/Catalyst/Catalyst-Runtime:8339
d7608cd0-831c-0410-93c0-e5b306c3c028:/local/Catalyst/Catalyst-Runtime-jrockway:8342
e56d974f-7718-0410-8b1c-b347a71765b2:/local/Catalyst-Runtime:6511
e56d974f-7718-0410-8b1c-b347a71765b2:/local/Catalyst-Runtime-current:10442
+ 1c72fc7c-9ce4-42af-bf25-3bfe470ff1e8:/local/Catalyst/trunk/Catalyst-Runtime:9763
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.70/branches/compres:7999
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.70/branches/context_go:8001
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.70/trunk:8533
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/Catalyst-Test-Updates:8363
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/add_captures_to_visit:9546
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/aggregate_more:11803
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/better_scripts:12074
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/disable_regex_fallback:11456
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/fix_iis_cgi:13450
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/fix_path_info_decoding:12089
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/fix_request_uri:13262
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/index_default_fuckage:10646
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/moose:7911
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/more_metaclass_compat:13280
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/namespace_handling_refactor:10655
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/param_filtering:13012
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/rt58057:13445
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/tweak_controller_action_creation:13440
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/uri_encode_captures_andor_args_take2:11811
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/branches/uri_for_utf8:12834
4ad37cd2-5fec-0310-835f-b3785c72a374:/Catalyst-Runtime/5.80/trunk:13451
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-ChildOf:4443
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-Runtime-jrockway:5857
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-component-setup:4320
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/Catalyst-docs:4325
4ad37cd2-5fec-0310-835f-b3785c72a374:/branches/current/Catalyst-Runtime:5142
4ad37cd2-5fec-0310-835f-b3785c72a374:/trunk/Catalyst:4483
4ad37cd2-5fec-0310-835f-b3785c72a374:/trunk/Catalyst-Runtime:6165
6d45476b-5895-46b8-b13a-8b969fa34c98:/local/Catalyst-Runtime-better_scripts:11331
6d45476b-5895-46b8-b13a-8b969fa34c98:/local/Catalyst-Runtime-mech_tests:15583
8a9521aa-ff93-41d6-9f87-b05cafcdab40:/local/cat/Catalyst-Runtime/5.80/trunk:8157
d7608cd0-831c-0410-93c0-e5b306c3c028:/local/Catalyst/Catalyst-Runtime:8339
d7608cd0-831c-0410-93c0-e5b306c3c028:/local/Catalyst/Catalyst-Runtime-jrockway:8342
e56d974f-7718-0410-8b1c-b347a71765b2:/local/Catalyst-Runtime:6511
e56d974f-7718-0410-8b1c-b347a71765b2:/local/Catalyst-Runtime-current:10442
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/Changes
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/Changes 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/Changes 2010-07-28 23:05:08 UTC (rev 13453)
@@ -1,5 +1,44 @@
# This file documents the revision history for Perl extension Catalyst.
+ New features:
+ - An 'action_class' method has been added to Catalyst::Controller to
+ allow controller base classes, roles or traits
+ (e.g. Catalyst::Controller::ActionRole) to more easily override
+ the default action creation.
+
+ Bug fixes:
+ - Fix the --mech and --mechanize options to the myapp_create.pl script
+ to operate correctly by fixing the options passed down into the script.
+ - Fix controllers with no method attributes (where the action definitions
+ are entirely contained in config). RT#58057
+ - Fix running as a CGI under IIS at non-root locations.
+
+ Documentation:
+ - Fix missing - in the docs when describing the --mechanize option at one
+ point.
+ - Explained the common practice how to access the component's config
+ values.
+ - Fixed typo in Catalyst/Script/Server.pm (RT #58474)
+
+5.80024 2010-05-15 11:55:44
+
+ Bug fixes:
+ - Revert the path resolution behaviour to how it used to work before
+ Catalyst 5.80014_02, so that application paths are (by default)
+ resolved from $ENV{PATH_INFO} and $ENV{SCRIPT_NAME}. This fixes backward
+ compatibility breakage seen by a number of people since that release
+ with mod_rewrite and SSI.
+
+ New features:
+ - Add a use_request_uri_for_path config setting to optionally
+ use the (more correct) $ENV{REQUEST_URI} path resolution behaviour.
+
+ Documentation:
+ - Clarify the documentation for the Catalyst::Stats interface.
+ - Copious documentation about the use_request_uri_for_path feature
+ and the implications of setting this to true/false in
+ Catalyst::Engine::CGI
+
5.80023 2010-05-07 23:50:27
Bug fixes:
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Component.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Component.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Component.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -170,7 +170,7 @@
C<< my $component_instance = $component->COMPONENT($app, $arguments); >>
-If this method is present (as it is on all Catalyst::Component subclasses,
+If this method is present (as it is on all Catalyst::Component subclasses),
it is called by Catalyst during setup_components with the application class
as $app and any config entry on the application for this component (for example,
in the case of MyApp::Controller::Foo this would be
@@ -185,7 +185,7 @@
sub COMPONENT {
my ($class, $app, $args) = @_;
- $args = $self->merge_config_hashes($self->config, $args);
+ $args = $class->merge_config_hashes($class->config, $args);
return $class->new($app, $args);
}
@@ -200,6 +200,12 @@
will be merged with any existing config settings. Each component in
a Catalyst application has its own config hash.
+The component's config hash is merged with any config entry on the
+application for this component and passed to C<new()> (as mentioned
+above at L</COMPONENT>). The common practice to access the merged
+config is to use a Moose attribute for each config entry on the
+receiving component.
+
=head2 $c->process()
This is the default method called on a Catalyst component in the dispatcher.
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Controller.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Controller.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Controller.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -225,7 +225,9 @@
foreach my $method (@methods) {
my $name = $method->name;
- my $attributes = $method->attributes;
+ # Horrible hack! All method metaclasses should have an attributes
+ # method, core Moose bug - see r13354.
+ my $attributes = $method->can('attributes') ? $method->attributes : [];
my $attrs = $self->_parse_attrs( $c, $name, @{ $attributes } );
if ( $attrs->{Private} && ( keys %$attrs > 1 ) ) {
$c->log->debug( 'Bad action definition "'
@@ -248,16 +250,25 @@
}
}
-sub create_action {
+sub action_class {
my $self = shift;
my %args = @_;
my $class = (exists $args{attributes}{ActionClass}
- ? $args{attributes}{ActionClass}[0]
- : $self->_action_class);
+ ? $args{attributes}{ActionClass}[0]
+ : $self->_action_class);
+
Class::MOP::load_class($class);
+ return $class;
+}
+sub create_action {
+ my $self = shift;
+ my %args = @_;
+
+ my $class = $self->action_class(%args);
my $action_args = $self->config->{action_args};
+
my %extra_args = (
%{ $action_args->{'*'} || {} },
%{ $action_args->{ $args{name} } || {} },
@@ -529,6 +540,11 @@
Creates action objects for a set of action methods using C< create_action >,
and registers them with the dispatcher.
+=head2 $self->action_class(%args)
+
+Used when a controller is creating an action to determine the correct base
+action class to use.
+
=head2 $self->create_action(%args)
Called with a hash of data to be use for construction of a new
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine/CGI.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine/CGI.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine/CGI.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -28,6 +28,43 @@
This is the Catalyst engine specialized for the CGI environment.
+=head1 PATH DECODING
+
+Most web server environments pass the requested path to the application using environment variables,
+from which Catalyst has to reconstruct the request base (i.e. the top level path to / in the application,
+exposed as C<< $c->request->base >>) and the request path below that base.
+
+There are two methods of doing this, both of which have advantages and disadvantages. Which method is used
+is determined by the C<< $c->config(use_request_uri_for_path) >> setting (which can either be true or false).
+
+=head2 use_request_uri_for_path => 0
+
+This is the default (and the) traditional method that Catalyst has used for determining the path information.
+The path is synthesised from a combination of the C<PATH_INFO> and C<SCRIPT_NAME> environment variables.
+The allows the application to behave correctly when C<mod_rewrite> is being used to redirect requests
+into the application, as these variables are adjusted by mod_rewrite to take account for the redirect.
+
+However this method has the major disadvantage that it is impossible to correctly decode some elements
+of the path, as RFC 3875 says: "C<< Unlike a URI path, the PATH_INFO is not URL-encoded, and cannot
+contain path-segment parameters. >>" This means PATH_INFO is B<always> decoded, and therefore Catalyst
+can't distinguish / vs %2F in paths (in addition to other encoded values).
+
+=head2 use_request_uri_for_path => 1
+
+This method uses the C<REQUEST_URI> and C<SCRIPT_NAME> environment variables. As C<REQUEST_URI> is never
+decoded, this means that applications using this mode can correctly handle URIs including the %2F character
+(i.e. with C<AllowEncodedSlashes> set to C<On> in Apache).
+
+Given that this method of path resolution is provably more correct, it is recommended that you use
+this unless you have a specific need to deploy your application in a non-standard environment, and you are
+aware of the implications of not being able to handle encoded URI paths correctly.
+
+However it also means that in a number of cases when the app isn't installed directly at a path, but instead
+is having paths rewritten into it (e.g. as a .cgi/fcgi in a public_html directory, with mod_rewrite in a
+.htaccess file, or when SSI is used to rewrite pages into the app, or when sub-paths of the app are exposed
+at other URIs than that which the app is 'normally' based at with C<mod_rewrite>), the resolution of
+C<< $c->request->base >> will be incorrect.
+
=head1 OVERLOADED METHODS
This class overloads some methods from C<Catalyst::Engine>.
@@ -117,6 +154,12 @@
my $scheme = $c->request->secure ? 'https' : 'http';
my $host = $ENV{HTTP_HOST} || $ENV{SERVER_NAME};
my $port = $ENV{SERVER_PORT} || 80;
+
+ # fix up for IIS
+ if ($ENV{SERVER_SOFTWARE} && $ENV{SERVER_SOFTWARE} =~ m{IIS/[6-9]\.\d}) {
+ $ENV{PATH_INFO} =~ s/^\Q$ENV{SCRIPT_NAME}\E//;
+ }
+
my $script_name = $ENV{SCRIPT_NAME};
$script_name =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go if $script_name;
@@ -148,30 +191,19 @@
}
}
- # RFC 3875: "Unlike a URI path, the PATH_INFO is not URL-encoded,
- # and cannot contain path-segment parameters." This means PATH_INFO
- # is always decoded, and the script can't distinguish / vs %2F.
- # See https://issues.apache.org/bugzilla/show_bug.cgi?id=35256
- # Here we try to resurrect the original encoded URI from REQUEST_URI.
my $path_info = $ENV{PATH_INFO};
- if (my $req_uri = $ENV{REQUEST_URI}) {
- $req_uri =~ s/^\Q$base_path\E//;
- $req_uri =~ s/\?.*$//;
- if ($req_uri) {
- # Note that if REQUEST_URI doesn't start with a /, then the user
- # is probably using mod_rewrite or something to rewrite requests
- # into a sub-path of their application..
- # This means that REQUEST_URI needs information from PATH_INFO
- # prepending to it to be useful, otherwise the sub path which is
- # being redirected to becomes the app base address which is
- # incorrect.
- if (substr($req_uri, 0, 1) ne '/') {
- my ($match) = $req_uri =~ m|^([^/]+)|;
- my ($path_info_part) = $path_info =~ m|^(.*?\Q$match\E)|;
- substr($req_uri, 0, length($match), $path_info_part)
- if $path_info_part;
+ if ($c->config->{use_request_uri_for_path}) {
+ # RFC 3875: "Unlike a URI path, the PATH_INFO is not URL-encoded,
+ # and cannot contain path-segment parameters." This means PATH_INFO
+ # is always decoded, and the script can't distinguish / vs %2F.
+ # See https://issues.apache.org/bugzilla/show_bug.cgi?id=35256
+ # Here we try to resurrect the original encoded URI from REQUEST_URI.
+ if (my $req_uri = $ENV{REQUEST_URI}) {
+ if (defined $script_name) {
+ $req_uri =~ s/^\Q$script_name\E//;
}
- $path_info = $req_uri;
+ $req_uri =~ s/\?.*$//;
+ $path_info = $req_uri if $req_uri;
}
}
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Engine.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -10,6 +10,8 @@
use HTTP::Body;
use HTTP::Headers;
use URI::QueryParam;
+use Encode ();
+use utf8;
use namespace::clean -except => 'meta';
@@ -131,7 +133,15 @@
$c->res->content_type('text/html; charset=utf-8');
my $name = ref($c)->config->{name} || join(' ', split('::', ref $c));
+
+ # Prevent Catalyst::Plugin::Unicode::Encoding from running.
+ # This is a little nasty, but it's the best way to be clean whether or
+ # not the user has an encoding plugin.
+ if ($c->can('encoding')) {
+ $c->{encoding} = '';
+ }
+
my ( $title, $error, $infos );
if ( $c->debug ) {
@@ -279,11 +289,12 @@
</body>
</html>
-
# Trick IE. Old versions of IE would display their own error page instead
# of ours if we'd give it less than 512 bytes.
$c->res->{body} .= ( ' ' x 512 );
+ $c->res->{body} = Encode::encode("UTF-8", $c->res->{body});
+
# Return 500
$c->res->status(500);
}
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Runtime.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Runtime.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Runtime.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -7,7 +7,7 @@
# Remember to update this in Catalyst as well!
-our $VERSION = '5.80023';
+our $VERSION = '5.80024';
=head1 NAME
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Create.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Create.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Create.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -46,7 +46,7 @@
Class::MOP::load_class($helper_class);
my $helper = $helper_class->new( { '.newfiles' => !$self->force, mech => $self->mechanize } );
- $self->_getopt_full_usage unless $helper->mk_component( $self->application_name, @ARGV );
+ $self->_getopt_full_usage unless $helper->mk_component( $self->application_name, @{$self->extra_argv} );
}
@@ -68,7 +68,7 @@
Examples:
myapp_create.pl controller My::Controller
myapp_create.pl controller My::Controller BindLex
- myapp_create.pl -mechanize controller My::Controller
+ myapp_create.pl --mechanize controller My::Controller
myapp_create.pl view My::View
myapp_create.pl view MyView TT
myapp_create.pl view TT TT
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Server.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Server.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst/Script/Server.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -231,7 +231,7 @@
a restart when modified
(defaults to '\.yml$|\.yaml$|\.conf|\.pm$')
--rdir --restart_directory the directory to search for
- modified files, can be set mulitple times
+ modified files, can be set multiple times
(defaults to '[SCRIPT_DIR]/..')
--sym --follow_symlinks follow symlinks in search directories
(defaults to false. this is a no-op on Win32)
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/lib/Catalyst.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -79,7 +79,7 @@
# Remember to update this in Catalyst::Runtime as well!
-our $VERSION = '5.80023';
+our $VERSION = '5.80024';
sub import {
my ( $class, @arguments ) = @_;
@@ -281,15 +281,16 @@
=head2 -Stats
-Enables statistics collection and reporting. You can also force this setting
-from the system environment with CATALYST_STATS or <MYAPP>_STATS. The
-environment settings override the application, with <MYAPP>_STATS having the
-highest priority.
+Enables statistics collection and reporting.
-e.g.
+ use Catalyst qw/-Stats=1/;
- use Catalyst qw/-Stats=1/
+You can also force this setting from the system environment with CATALYST_STATS
+or <MYAPP>_STATS. The environment settings override the application, with
+<MYAPP>_STATS having the highest priority.
+Stats are also enabled if L<< debugging |/"-Debug" >> is enabled.
+
=head1 METHODS
=head2 INFORMATION ABOUT THE CURRENT REQUEST
@@ -891,7 +892,7 @@
For example:
MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
- MyApp::Model::Foo->config({ quux => 'frob', 'overrides => 'this' });
+ MyApp::Model::Foo->config({ quux => 'frob', overrides => 'this' });
will mean that C<MyApp::Model::Foo> receives the following data when
constructed:
@@ -902,6 +903,21 @@
overrides => 'me',
});
+It's common practice to use a Moose attribute
+on the receiving component to access the config value.
+
+ package MyApp::Model::Foo;
+
+ use Moose;
+
+ # this attr will receive 'baz' at construction time
+ has 'bar' => (
+ is => 'rw',
+ isa => 'Str',
+ );
+
+You can then get the value 'baz' by calling $c->model('Foo')->bar
+
=cut
around config => sub {
@@ -2405,10 +2421,6 @@
# we know M::P::O found a file on disk so this is safe
Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
-
- # Needs to be done as soon as the component is loaded, as loading a sub-component
- # (next time round the loop) can cause us to get the wrong metaclass..
- $class->_controller_init_base_classes($component);
}
for my $component (@comps) {
@@ -2418,7 +2430,6 @@
: $class->expand_component_module( $component, $config );
for my $component (@expanded_components) {
next if $comps{$component};
- $class->_controller_init_base_classes($component); # Also cover inner packages
$class->components->{ $component } = $class->setup_component($component);
}
}
@@ -2471,19 +2482,6 @@
=cut
-# FIXME - Ugly, ugly hack to ensure the we force initialize non-moose base classes
-# nearest to Catalyst::Controller first, no matter what order stuff happens
-# to be loaded. There are TODO tests in Moose for this, see
-# f2391d17574eff81d911b97be15ea51080500003
-sub _controller_init_base_classes {
- my ($app_class, $component) = @_;
- return unless $component->isa('Catalyst::Controller');
- foreach my $class ( reverse @{ mro::get_linear_isa($component) } ) {
- Moose::Meta::Class->initialize( $class )
- unless find_meta($class);
- }
-}
-
sub setup_component {
my( $class, $component ) = @_;
@@ -2830,15 +2828,24 @@
Returns an arrayref of the internal execution stack (actions that are
currently executing).
+=head2 $c->stats
+
+Returns the current timing statistics object. By default Catalyst uses
+L<Catalyst::Stats|Catalyst::Stats>, but can be set otherwise with
+L<< stats_class|/"$c->stats_class" >>.
+
+Even if L<< -Stats|/"-Stats" >> is not enabled, the stats object is still
+available. By enabling it with C< $c->stats->enabled(1) >, it can be used to
+profile explicitly, although MyApp.pm still won't profile nor output anything
+by itself.
+
=head2 $c->stats_class
-Returns or sets the stats (timing statistics) class.
+Returns or sets the stats (timing statistics) class. L<Catalyst::Stats|Catalyst::Stats> is used by default.
=head2 $c->use_stats
-Returns 1 when stats collection is enabled. Stats collection is enabled
-when the -Stats options is set, debug is on or when the <MYAPP>_STATS
-environment variable is set.
+Returns 1 when L<< stats collection|/"-Stats" >> is enabled.
Note that this is a static method, not an accessor and should be overridden
by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
@@ -2936,6 +2943,12 @@
=item *
+C<use_request_uri_for_path> - Controlls if the C<REQUEST_URI> or C<PATH_INFO> environment
+variable should be used for determining the request path. See L<Catalyst::Engine::CGI/PATH DECODING>
+for more information.
+
+=item *
+
C<using_frontend_proxy> - See L</PROXY SUPPORT>.
=back
@@ -3165,6 +3178,8 @@
Robert Sedlacek C<< <rs at 474.at> >>
+SpiceMan: Marcel Montes
+
sky: Arthur Bergman
szbalint: Balint Szilakszi <szbalint at cpan.org>
@@ -3183,6 +3198,8 @@
Yuval Kogman, C<nothingmuch at woobling.org>
+rainboxx: Matthias Dietrich, C<perl at rainboxx.de>
+
=head1 LICENSE
This library is free software. You can redistribute it and/or modify it under
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/live_component_controller_args.t
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/live_component_controller_args.t 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/live_component_controller_args.t 2010-07-28 23:05:08 UTC (rev 13453)
@@ -73,15 +73,15 @@
my $response;
- ok( $response = request("http://localhost/args/args/$path"), "Requested args for path $path");
+ ok( $response = request("http://localhost/args/args/$path"), "Requested /args/args/$path");
is( $response->content, $test, "$test as args" );
undef $response;
- ok( $response = request("http://localhost/args/params/$path"), "Requested params for path $path");
+ ok( $response = request("http://localhost/args/params/$path"), "Requested /args/params/$path");
- is( $response->content, $test, "$test as params" );
+ is( $response->content, $test, "response content $test as params" );
undef $response;
Added: Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_ctx_attr.t
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_ctx_attr.t (rev 0)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_ctx_attr.t 2010-07-28 23:05:08 UTC (rev 13453)
@@ -0,0 +1,30 @@
+use strict;
+use warnings;
+use FindBin qw/$Bin/;
+use lib "$FindBin::Bin/../lib";
+use Test::More;
+use URI;
+
+use_ok('TestApp');
+
+my $request = Catalyst::Request->new( {
+ base => URI->new('http://127.0.0.1/foo')
+ } );
+my $dispatcher = TestApp->dispatcher;
+my $context = TestApp->new( {
+ request => $request,
+ namespace => 'yada',
+ } );
+
+is( $context->hello_lazy, 'hello there', '$context->hello_lazy');
+eval { is( $context->hello_notlazy, 'hello there', '$context->hello_notlazy') };
+TODO: {
+ local $TODO = 'we appear to have a lazy bug';
+ if ($@) {
+ fail('$context->hello_notlazy');
+ warn $@;
+ }
+}
+
+done_testing;
+
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_engine_cgi-prepare_path.t
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_engine_cgi-prepare_path.t 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/t/aggregate/unit_core_engine_cgi-prepare_path.t 2010-07-28 23:05:08 UTC (rev 13453)
@@ -8,18 +8,18 @@
# mod_rewrite to app root for non / based app
{
- my $r = get_req (
+ my $r = get_req (0,
REDIRECT_URL => '/comics/',
SCRIPT_NAME => '/comics/dispatch.cgi',
REQUEST_URI => '/comics/',
);
- is ''.$r->uri, 'http://www.foo.com/comics/';
- is ''.$r->base, 'http://www.foo.com/comics/';
+ is ''.$r->uri, 'http://www.foo.com/comics/', 'uri is correct';
+ is ''.$r->base, 'http://www.foo.com/comics/', 'base is correct';
}
# mod_rewrite to sub path under app root for non / based app
{
- my $r = get_req (
+ my $r = get_req (0,
PATH_INFO => '/foo/bar.gif',
REDIRECT_URL => '/comics/foo/bar.gif',
SCRIPT_NAME => '/comics/dispatch.cgi',
@@ -31,7 +31,7 @@
# Standard CGI hit for non / based app
{
- my $r = get_req (
+ my $r = get_req (0,
PATH_INFO => '/static/css/blueprint/screen.css',
SCRIPT_NAME => '/~bobtfish/Gitalist/script/gitalist.cgi',
REQUEST_URI => '/~bobtfish/Gitalist/script/gitalist.cgi/static/css/blueprint/screen.css',
@@ -41,19 +41,19 @@
}
# / %2F %252F escaping case.
{
- my $r = get_req (
+ my $r = get_req (1,
PATH_INFO => '/%2F/%2F',
SCRIPT_NAME => '/~bobtfish/Gitalist/script/gitalist.cgi',
REQUEST_URI => '/~bobtfish/Gitalist/script/gitalist.cgi/%252F/%252F',
);
- is ''.$r->uri, 'http://www.foo.com/~bobtfish/Gitalist/script/gitalist.cgi/%252F/%252F';
- is ''.$r->base, 'http://www.foo.com/~bobtfish/Gitalist/script/gitalist.cgi/';
+ is ''.$r->uri, 'http://www.foo.com/~bobtfish/Gitalist/script/gitalist.cgi/%252F/%252F', 'uri correct';
+ is ''.$r->base, 'http://www.foo.com/~bobtfish/Gitalist/script/gitalist.cgi/', 'base correct';
}
# Using rewrite rules to ask for a sub-path in your app.
# E.g. RewriteRule ^(.*)$ /path/to/fastcgi/domainprofi.fcgi/iframeredirect$1 [L,NS]
{
- my $r = get_req (
+ my $r = get_req (0,
PATH_INFO => '/iframeredirect/info',
SCRIPT_NAME => '',
REQUEST_URI => '/info',
@@ -64,7 +64,7 @@
# nginx example from espent with path /"foo"
{
- my $r = get_req (
+ my $r = get_req (0,
PATH_INFO => '"foo"',
SCRIPT_NAME => '/',
REQUEST_URI => '/%22foo%22',
@@ -76,33 +76,45 @@
# nginx example from espent with path /"foo" and the app based at /oslobilder
{
- my $r = get_req (
+ my $r = get_req (1,
PATH_INFO => 'oslobilder/"foo"',
SCRIPT_NAME => '/oslobilder/',
REQUEST_URI => '/oslobilder/%22foo%22',
);
- is ''.$r->path, '%22foo%22';
- is ''.$r->uri, 'http://www.foo.com/oslobilder/%22foo%22';
- is ''.$r->base, 'http://www.foo.com/oslobilder/';
+ is ''.$r->path, '%22foo%22', 'path correct';
+ is ''.$r->uri, 'http://www.foo.com/oslobilder/%22foo%22', 'uri correct';
+ is ''.$r->base, 'http://www.foo.com/oslobilder/', 'base correct';
}
+# CGI hit on IIS for non / based app
{
- local $TODO = 'Another mod_rewrite case';
- my $r = get_req (
+ my $r = get_req(0,
+ SERVER_SOFTWARE => 'Microsoft-IIS/6.0',
+ PATH_INFO => '/bobtfish/Gitalist/script/gitalist.cgi/static/css/blueprint/screen.css',
+ SCRIPT_NAME => '/bobtfish/Gitalist/script/gitalist.cgi',
+ PATH_TRANSLATED =>
+'C:\\Inetpub\\vhosts\\foo.com\\httpdocs\\bobtfish\\Gitalist\\script\\gitalist.cgi\\static\\css\\blueprint\\screen.css',
+ );
+ is ''.$r->uri, 'http://www.foo.com/bobtfish/Gitalist/script/gitalist.cgi/static/css/blueprint/screen.css';
+ is ''.$r->base, 'http://www.foo.com/bobtfish/Gitalist/script/gitalist.cgi/';
+}
+
+{
+ my $r = get_req (0,
PATH_INFO => '/auth/login',
SCRIPT_NAME => '/tx',
REQUEST_URI => '/login',
);
- is ''.$r->path, 'auth/login';
- is ''.$r->uri, 'http://www.foo.com/tx/auth/login';
- is ''.$r->base, 'http://www.foo.com/tx/';
+ is ''.$r->path, 'auth/login', 'path correct';
+ is ''.$r->uri, 'http://www.foo.com/tx/auth/login', 'uri correct';
+ is ''.$r->base, 'http://www.foo.com/tx/', 'base correct';
}
# test req->base and c->uri_for work correctly after an internally redirected request
# (i.e. REDIRECT_URL set) when the PATH_INFO contains a regex
{
my $path = '/engine/request/uri/Rx(here)';
- my $r = get_req (
+ my $r = get_req (0,
SCRIPT_NAME => '/',
PATH_INFO => $path,
REQUEST_URI => $path,
@@ -113,7 +125,6 @@
is $r->base, 'http://www.foo.com/', 'Base is correct';
}
-
# FIXME - Test proxy logic
# - Test query string
# - Test non standard port numbers
@@ -121,6 +132,8 @@
# - Test scheme (secure request on port 80)
sub get_req {
+ my $use_request_uri_for_path = shift;
+
my %template = (
HTTP_HOST => 'www.foo.com',
PATH_INFO => '/',
@@ -129,6 +142,9 @@
local %ENV = (%template, @_);
my $i = TestApp->new;
+ $i->setup_finished(0);
+ $i->config(use_request_uri_for_path => $use_request_uri_for_path);
+ $i->setup_finished(1);
$i->engine(Catalyst::Engine::CGI->new);
$i->engine->prepare_path($i);
return $i->req;
Added: Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp/Controller/Moose/NoAttributes.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp/Controller/Moose/NoAttributes.pm (rev 0)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp/Controller/Moose/NoAttributes.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -0,0 +1,16 @@
+package TestApp::Controller::Moose::NoAttributes;
+use Moose;
+extends qw/Catalyst::Controller/;
+
+__PACKAGE__->config(
+ actions => {
+ test => { Local => undef }
+ }
+);
+
+sub test {
+}
+
+no Moose;
+1;
+
Modified: Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp.pm 2010-07-28 23:03:44 UTC (rev 13452)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/t/lib/TestApp.pm 2010-07-28 23:05:08 UTC (rev 13453)
@@ -16,10 +16,39 @@
use Moose;
use namespace::autoclean;
+# -----------
+# t/aggregate/unit_core_ctx_attr.t pukes until lazy is true
+package Greeting;
+use Moose;
+sub hello_notlazy { 'hello there' }
+sub hello_lazy { 'hello there' }
+
+package TestApp;
+has 'my_greeting_obj_notlazy' => (
+ is => 'ro',
+ isa => 'Greeting',
+ default => sub { Greeting->new() },
+ handles => [ qw( hello_notlazy ) ],
+ lazy => 0,
+);
+has 'my_greeting_obj_lazy' => (
+ is => 'ro',
+ isa => 'Greeting',
+ default => sub { Greeting->new() },
+ handles => [ qw( hello_lazy ) ],
+ lazy => 1,
+);
+# -----------
+
our $VERSION = '0.01';
-TestApp->config( name => 'TestApp', root => '/some/dir' );
+TestApp->config( name => 'TestApp', root => '/some/dir', use_request_uri_for_path => 1 );
+# Test bug found when re-adjusting the metaclass compat code in Moose
+# in 292360. Test added to Moose in 4b760d6, but leave this attribute
+# above ->setup so we have some generated methods to be double sure.
+has an_attribute_before_we_change_base_classes => ( is => 'ro');
+
if ($::setup_leakchecker && eval { Class::MOP::load_class('CatalystX::LeakChecker'); 1 }) {
with 'CatalystX::LeakChecker';
Added: Catalyst-Runtime/5.80/branches/forward-comp-obj/t/unit_core_methodattributes_method_metaclass_on_subclasses.t
===================================================================
--- Catalyst-Runtime/5.80/branches/forward-comp-obj/t/unit_core_methodattributes_method_metaclass_on_subclasses.t (rev 0)
+++ Catalyst-Runtime/5.80/branches/forward-comp-obj/t/unit_core_methodattributes_method_metaclass_on_subclasses.t 2010-07-28 23:05:08 UTC (rev 13453)
@@ -0,0 +1,30 @@
+use strict;
+use Test::More;
+
+{
+ package NoAttributes::CT;
+ use Moose;
+ BEGIN { extends qw/Catalyst::Controller/; };
+
+ sub test {}
+}
+{
+ package NoAttributes::RT;
+ use Moose;
+ extends qw/Catalyst::Controller/;
+
+ sub test {}
+}
+
+foreach my $class (qw/ CT RT /) {
+ my $class_name = 'NoAttributes::' . $class;
+ my $meta = $class_name->meta;
+ my $meth = $meta->find_method_by_name('test');
+ {
+ local $TODO = "Known MX::MethodAttributes issue";
+ ok $meth->can('attributes'), 'method metaclass has ->attributes method for ' . $class;;
+ }
+}
+
+done_testing;
+
More information about the Catalyst-commits
mailing list