package JS::YUI::Loader::Manifest; use strict; use warnings; use Moose; use Algorithm::Dependency::Ordered; use Algorithm::Dependency::Source::HoA; # TODO use Hash::Dirty has catalog => qw/is ro required 1 isa JS::YUI::Loader::Catalog/; has loader => qw/is ro isa JS::YUI::Loader/; has collection => qw/is ro required 1 lazy 1/, default => sub { {} }; has dirty => qw/is rw required 1 lazy 1 default 1/; has include => qw/is ro required 1 lazy 1/, default => sub { my $self = shift; require JS::YUI::Loader::IncludeExclude; return JS::YUI::Loader::IncludeExclude->new(manifest => $self, do_include => 1); }; has exclude => qw/is ro required 1 lazy 1/, default => sub { my $self = shift; require JS::YUI::Loader::IncludeExclude; return JS::YUI::Loader::IncludeExclude->new(manifest => $self, do_include => 0); }; sub schedule { my $self = shift; my @schedule = $self->_calculate; return wantarray ? @schedule : \@schedule; } my $dependency; sub _calculate { my $self = shift; if (! $self->{schedule} || $self->dirty) { $dependency ||= Algorithm::Dependency::Ordered->new( source => Algorithm::Dependency::Source::HoA->new($self->catalog->dependency_graph), ); my $schedule = $dependency->schedule(keys %{ $self->collection }) || []; my @css_schedule = grep { $self->catalog->entry($_)->css } @$schedule; my @js_schedule = grep { $self->catalog->entry($_)->js } @$schedule; @css_schedule = sort { $self->catalog->entry($a)->rank <=> $self->catalog->entry($b)->rank } @css_schedule; $self->{schedule} = [ @css_schedule, @js_schedule ]; } return @{ $self->{schedule} }; } sub parse { my $self = shift; my @_collection = map { split m/\n/ } @_; my @collection; for (@_collection) { next if m/^\s*#/; next if m/^\s*