X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FComponent.pm;h=bccd3f951005e26166160d607c94d84abc1c1e69;hb=5d02e7902fb093a28deeea34bd4bd8a729e78be4;hp=0fbca47f77be75e5ac919289b0b6efce3dd8a19a;hpb=1b79e1994c40fc525b4a84c900a5c95ffd4a2f8a;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Component.pm b/lib/Catalyst/Component.pm index 0fbca47..bccd3f9 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,7 +61,17 @@ component loader with config() support and a process() method placeholder. __PACKAGE__->mk_classdata('_plugins'); __PACKAGE__->mk_classdata('_config'); -has _component_name => ( is => 'ro' ); +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 +# 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); + 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 { my $class = shift; @@ -74,7 +85,7 @@ sub BUILDARGS { } elsif (Class::MOP::is_class_loaded($_[0]) && $_[0]->isa('Catalyst') && ref($_[1]) eq 'HASH') { $args = $_[1]; - } elsif ($_[0] == $_[1]) { + } elsif ($_[0] eq $_[1]) { $args = $_[1]; } else { $args = +{ @_ }; @@ -103,6 +114,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]} }; @@ -137,6 +150,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; @@ -145,7 +163,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. @@ -156,9 +174,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. @@ -194,6 +213,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)