X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FComponent.pm;h=1b2d46201921ccf0b7b02543e530e27098191540;hb=83e69a6b03e61e29f918144cff0b0562e2a92ec4;hp=ee1f99ac33451b25ea197d8c67d7f3e42c6b7e27;hpb=d2598ac82e8508f4d6da90ec60a1ed60840c2016;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Component.pm b/lib/Catalyst/Component.pm index ee1f99a..1b2d462 100644 --- a/lib/Catalyst/Component.pm +++ b/lib/Catalyst/Component.pm @@ -5,6 +5,7 @@ use Class::MOP; use Class::MOP::Object; use Catalyst::Utils; use Class::C3::Adopt::NEXT; +use Devel::InnerPackage (); use MRO::Compat; use mro 'c3'; use Scalar::Util 'blessed'; @@ -60,13 +61,16 @@ component loader with config() support and a process() method placeholder. __PACKAGE__->mk_classdata('_plugins'); __PACKAGE__->mk_classdata('_config'); -has _component_name => ( is => 'ro' ); # Cannot be required => 1 as context +has catalyst_component_name => ( is => 'ro' ); # Cannot be required => 1 as context # class @ISA component - HATE # Make accessor callable as a class method, as we need to call setup_actions # on the application class, which we don't have an instance of, ewwwww -around _component_name => sub { +# Also, naughty modules like Catalyst::View::JSON try to write to _everything_, +# so spit a warning, ignore that (and try to do the right thing anyway) here.. +around catalyst_component_name => sub { my ($orig, $self) = (shift, shift); - blessed($self) ? $self->$orig(@_) : $self; + Carp::cluck("Tried to write to the catalyst_component_name accessor - is your component broken or just mad? (Write ignored - using default value.)") if scalar @_; + blessed($self) ? $self->$orig() || blessed($self) : $self; }; sub BUILDARGS { @@ -81,8 +85,6 @@ sub BUILDARGS { } elsif (Class::MOP::is_class_loaded($_[0]) && $_[0]->isa('Catalyst') && ref($_[1]) eq 'HASH') { $args = $_[1]; - } elsif ($_[0] == $_[1]) { - $args = $_[1]; } else { $args = +{ @_ }; } @@ -110,6 +112,8 @@ sub COMPONENT { sub config { my $self = shift; + # Uncomment once sane to do so + #Carp::cluck("config method called on instance") if ref $self; my $config = $self->_config || {}; if (@_) { my $newconfig = { %{@_ > 1 ? {@_} : $_[0]} }; @@ -144,6 +148,11 @@ sub process { . " did not override Catalyst::Component::process" ); } +sub expand_modules { + my ($class, $component) = @_; + return Devel::InnerPackage::list_packages( $component ); +} + __PACKAGE__->meta->make_immutable; 1; @@ -152,7 +161,7 @@ __END__ =head1 METHODS -=head2 new($c, $arguments) +=head2 new($app, $arguments) Called by COMPONENT to instantiate the component; should return an object to be stored in the application's component hash. @@ -163,9 +172,10 @@ C<< my $component_instance = $component->COMPONENT($app, $arguments); >> 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 $c and any config entry on the application for this component (for example, +as $app and any config entry on the application for this component (for example, in the case of MyApp::Controller::Foo this would be C<< MyApp->config('Controller::Foo' => \%conf >>). + The arguments are expected to be a hashref and are merged with the C<< __PACKAGE__->config >> hashref before calling C<< ->new >> to instantiate the component. @@ -201,6 +211,13 @@ when you forward to them. The default is an abstract method. Merges two hashes together recursively, giving right-hand precedence. Alias for the method in L. +=head2 $c->expand_modules( $setup_component_config ) + +Return a list of extra components that this component has created. By default, +it just looks for a list of inner packages of this component + +=cut + =head1 OPTIONAL METHODS =head2 ACCEPT_CONTEXT($c, @args)